【发布时间】:2013-11-12 09:00:02
【问题描述】:
我很困惑为什么会发生这种情况,尽管我之前已经使用过这样的陈述。我只是简单地将一个字符串复制到另一个字符串中,而我的原始字符串已损坏,甚至在strtok 被调用之前。这是相关代码sn-p,之后我使用strtok。但在此之前,我看到 reference 已损坏。
int j, sizeref;
char *str1, *token;
printf("%s :", reference);
sizeref = strlen(reference);
printf("%d\n", sizeref);
track = malloc(sizeref);
printf("%s :", reference);
strcpy(track, reference);
printf("%d\n", strlen(track));
这是下面的输出。第一行打印整个reference,正确大小为234。之后我看到只有106 个字符被复制,原始字符串reference 也被截断为106 个字符。 track 被声明为char *
+918956549122,9527529747,09847778399,08596774833,9867859469,+919999866778,6985888696,5968939898,6959869856,9898495895,6986596865,09847765399,88596774833,9967859469,+917899866778,6985889696,9527567747,09848778399,08596756733,9867999469 :234
+918956549122,9527529747,09847778399,08596774833,9867859469,+919999866778,6985888696,5968939898,69598698 :106
更多信息: 参考以 50 字节为单位逐渐增加。一旦完全建成,则只能按上述方式使用。 char * reference 是全局的,并且在 main 内部建立起来。上面提到的代码在一个单独的函数中
realloc(reference,strlen(reference) + CHUNK);
【问题讨论】:
-
track = malloc(sizeref + 1)... 您没有为 NUL 终止符分配空间。除此之外,您的程序还有另一个 UB。strlen()返回size_t和 notint,因此您必须使用%zu而不是%d打印它。 -
@H2CO3 你有时为我节省了很多该死的打字。总有一天我要回报那个人情=P
-
@WhozCraig :D 很公平。
标签: c malloc strtok strlen strcpy