C_内存非法访问问题

时间:2022-11-16 18:22:02

#include <stdio.h>

char *func(void)
{
    char *str = "Hello world";
    return str;
}

int main(void)
{
    char *p = NULL;
    p = func();
    
    return 0;
}

这段代码有缺陷吗?会存在非法内存访问吗?

7 个解决方案

#1


面试题   

工作中谁会写这样的代码啊

#2


编译器编译程序时将"hello,world"这个字符串常量存放在了常量存储区中,定义指针时char *str="hello,world";   str指向的是常量态存储区地址,所以尽管从函数返回了,但是常量存储区存储的字符串还是有效的,常量存储区要在程序结束的时候才释放!

#3


不会

func 返回的其实不是局部变量, 而是指向只读数据段内的一个指针

#4


引用 2 楼 Jake443403168 的回复:
编译器编译程序时将"hello,world"这个字符串常量存放在了常量存储区中,定义指针时char *str="hello,world";   str指向的是常量态存储区地址,所以尽管从函数返回了,但是常量存储区存储的字符串还是有效的,常量存储区要在程序结束的时候才释放!

常量存储区中的内容不会改变么?比如str指向的内存不会在程序的后续运行中被覆盖吗?

#5


引用 4 楼 hfutwangyd 的回复:
Quote: 引用 2 楼 Jake443403168 的回复:

编译器编译程序时将"hello,world"这个字符串常量存放在了常量存储区中,定义指针时char *str="hello,world";   str指向的是常量态存储区地址,所以尽管从函数返回了,但是常量存储区存储的字符串还是有效的,常量存储区要在程序结束的时候才释放!

常量存储区中的内容不会改变么?比如str指向的内存不会在程序的后续运行中被覆盖吗?

char *str = "Hello world"; <===> const char *str = "Hello world";

#6


常量存储区的内存是不允许被重写的,是作为代码的一部分被加载,如果你试图修改常量存储区的内容,编译将会报错

#7


2楼和10楼说的很清楚了,   常量区的内容当然不会被更改了

#1


面试题   

工作中谁会写这样的代码啊

#2


编译器编译程序时将"hello,world"这个字符串常量存放在了常量存储区中,定义指针时char *str="hello,world";   str指向的是常量态存储区地址,所以尽管从函数返回了,但是常量存储区存储的字符串还是有效的,常量存储区要在程序结束的时候才释放!

#3


不会

func 返回的其实不是局部变量, 而是指向只读数据段内的一个指针

#4


引用 2 楼 Jake443403168 的回复:
编译器编译程序时将"hello,world"这个字符串常量存放在了常量存储区中,定义指针时char *str="hello,world";   str指向的是常量态存储区地址,所以尽管从函数返回了,但是常量存储区存储的字符串还是有效的,常量存储区要在程序结束的时候才释放!

常量存储区中的内容不会改变么?比如str指向的内存不会在程序的后续运行中被覆盖吗?

#5


引用 4 楼 hfutwangyd 的回复:
Quote: 引用 2 楼 Jake443403168 的回复:

编译器编译程序时将"hello,world"这个字符串常量存放在了常量存储区中,定义指针时char *str="hello,world";   str指向的是常量态存储区地址,所以尽管从函数返回了,但是常量存储区存储的字符串还是有效的,常量存储区要在程序结束的时候才释放!

常量存储区中的内容不会改变么?比如str指向的内存不会在程序的后续运行中被覆盖吗?

char *str = "Hello world"; <===> const char *str = "Hello world";

#6


常量存储区的内存是不允许被重写的,是作为代码的一部分被加载,如果你试图修改常量存储区的内容,编译将会报错

#7


2楼和10楼说的很清楚了,   常量区的内容当然不会被更改了