va_list和char *字符串

时间:2013-07-31 16:07:02

标签: c variadic-functions

[EDIT] 插入的NULL在样本中终止

我有一个函数接收以va_list结尾的NULL。我在名为char*的{​​{1}}中连接每个字符串。函数按预期工作,除了我joinedString每次调用此函数时它的大小增加。我的意思是前一个字符串仍然存在,并且新字符串已加入。

实施例: 第一个电话:

joinedString

结果:“asd”

第二个电话:

ShowMsg(style1, "a", "s", "d", NULL);

结果:“asdwwq”

这种行为很奇怪,因为每次调用此函数时ShowMsg(style1, "w", "w", "q", NULL); 都会被初始化。 va_list是否包含以前使用的值? 我使用C而不是C ++,我知道,使用std :: string会更容易。

joinedString

2 个答案:

答案 0 :(得分:3)

char *joinedString = ""表示joinedString指向一个只读的1字节字符数组。

你不应该写那段记忆。它会在许多系统上崩溃。此外,即使可以,当您使用strcat( joinedString, theArg );写入数组的末尾时,也会调用未定义的行为。

答案 1 :(得分:3)

那是因为你无法初始化这样的字符串。您的初始值设定项char* joinedString = ""正在初始化指针joinedString以指向程序开头的特定内存地址,该地址由空字符串组成。

然后,第一次调用该函数时,joinedString被设置为指向仍为空的内存区域。然后你把一些字符放在那里然后退出。

下次开始时,角色仍在那里。您初始化的唯一内容是指针,而不是实际数据。 strcat然后将新的args附加到已经填充的字符串的末尾!

这应该是segfaulting,我实际上对你的程序正在输出ANYTHING印象深刻。它可能只是工作,因为你只使用几个字节,所以你不会覆盖太多。

要修复它,请使用malloc:

初始化joinString
char* joinedString = malloc(MAX_LENGTH * sizeof(*joinedString));
joinedString[0] = '\0'; // Initialize to an empty string

然后在你的功能结束时,释放那个记忆

free(joinedString);