[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
答案 0 :(得分:3)
char *joinedString = ""
表示joinedString指向一个只读的1字节字符数组。
你不应该写那段记忆。它会在许多系统上崩溃。此外,即使可以,当您使用strcat( joinedString, theArg );
写入数组的末尾时,也会调用未定义的行为。
答案 1 :(得分:3)
那是因为你无法初始化这样的字符串。您的初始值设定项char* joinedString = ""
正在初始化指针joinedString
以指向程序开头的特定内存地址,该地址由空字符串组成。
然后,第一次调用该函数时,joinedString
被设置为指向仍为空的内存区域。然后你把一些字符放在那里然后退出。
下次开始时,角色仍在那里。您初始化的唯一内容是指针,而不是实际数据。 strcat
然后将新的args附加到已经填充的字符串的末尾!
这应该是segfaulting,我实际上对你的程序正在输出ANYTHING印象深刻。它可能只是工作,因为你只使用几个字节,所以你不会覆盖太多。
要修复它,请使用malloc:
初始化joinStringchar* joinedString = malloc(MAX_LENGTH * sizeof(*joinedString));
joinedString[0] = '\0'; // Initialize to an empty string
然后在你的功能结束时,释放那个记忆
free(joinedString);