Returning strings with const char * in C
我试图了解为什么以下字符串传递适用于我的错误字符串。 我已经从更大的来源获得了这个例子。
我的问题是; 为什么我不必专门为包含错误消息的char数组分配内存? 我以为我需要为该字符串分配一些内存,并使用err指针指示该内存的开始。
这是因为它是
我可能会用错的措词来表达问题,这就是为什么搜索没有帮助我理解这一点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | const char * my_function(int a) { if (a != 1) return"a doesn't equal 1!" else return NULL; } int main(int a) { const char *err; err = my_function(a); if (err) fprintf(stderr,"Message = %s ",err); return 1; return 0; } |
所有字符串文字都在编译时分配。当您启动程序时,它们已经驻留在程序存储器的只读区域中。它们不会在运行时分配。您可以将它们视为常量字符数组。与任何
您正在返回字符串文字。它被保存在静态内存中,但是地址和其他字符串一样。因此,您可以随时参考该地址。问题是如果您尝试更改字符串文字,我认为这是未定义的行为。
字符串文字被分配为具有静态存储持续时间的const char数组,因此它们在程序的整个生命周期中都有效。它们碰巧所处的范围无关紧要-它们始终具有静态存储期限。
这意味着您可以获取它们的地址(如果您返回字符串文字或将其存储在const char *变量中的任何位置,则会隐式发生),而不必担心结果指针的寿命。字符串文字的存储将永远不会用于其他用途。
请注意,您的
1 2 3 4 5 6 7 8 9 10 | int main(int a) { const char *err; err = my_function(a); if (err) fprintf(stderr,"Message = %s ",err); return 1; return 0; } |
1 2 3 4 5 6 7 8 9 10 | int main(int a) { const char *err; err = my_function(a); if (err) fprintf(stderr,"Message = %s ",err); return 1; return 0; # Never gets executed. } |
您想要的是:
1 2 3 4 5 6 7 8 9 10 11 | int main(int a) { const char *err; err = my_function(a); if (err) { fprintf(stderr,"Message = %s ",err); return 1; } return 0; } |
出于这个原因,即使在并非绝对必要的情况下,我也总是在块周围使用括号。
这是因为字符串存储在程序的数据部分中。当您键入
您的函数仅将指针返回到该内存片,而
不要太乐观。这是因为子例程中的字符串存储在共享段中(只读),并且可以在例程退出后返回它。如果将其定义为char str [] =" your string",则将无法返回该值,因为它已"分配"在堆栈上。堆栈指针将在子例程结束时恢复。