【发布时间】:2016-03-19 13:44:23
【问题描述】:
我的问题很难用语言表达,所以我只给出一个代码示例:
#include <stdio.h>
typedef struct {
char *str;
} strHold;
void f2(char *s)
{
*s = "Char 2";
}
void f3(strHold *str)
{
(*str).str = "Struct 2";
}
int main()
{
char *s1 = "Char 1";
strHold str1;
str1.str = "Struct 1";
//f2(s1);
f3(&str1);
printf("%s, ", s1);
printf("%s", str1.str);
return 0;
}
这个 C 程序运行,甚至在第二次打印时显示“Struct 2”。但是函数 f2 不起作用,例如,如果我删除评论,程序就会崩溃。 我其实并不惊讶 f2 不起作用,我更想知道为什么 f3 起作用?
当我在函数范围内定义字符串常量时,一旦我退出函数范围,就应该释放该数据,对吗?这意味着一旦我返回调用函数范围,数据就会变成垃圾。
那么...结构版本是如何工作的?有人可以解释一下内存在这两种情况下是如何工作的,以及在调用函数中从它调用的函数初始化未知长度的字符串的“正确”方法是什么?
【问题讨论】:
-
在构建、阅读它们、尝试理解它们的含义并修复警告的根本原因时,您应该从这个程序中得到很多警告(并且通过“修复”我不只是扔掉警告)。
-
还了解如何在 c 中模拟通过引用传递。
标签: c