2

我很困惑为什么会发生这种情况,尽管我之前已经使用过这样的陈述。我只是将一个字符串复制到另一个字符串中,而我的原始字符串甚至在strtok被调用之前就已损坏。这是相关的代码片段,在此之后我正在使用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);
4

3 回答 3

3

根据 strlen() 的手册:

DESCRIPTION
       The  strlen()  function calculates the length of the string s,
       excluding the terminating null byte ('\0').

因此,如上所述,您应该分配大小为 strlen() + 1 的缓冲区以正确终止空值。

于 2013-11-01T08:38:10.530 回答
1

C 字符串以 null 结尾。将代码更改为track=malloc(sizeref + 1);,否则 strcpy 将尝试将空终止写入有效内存之外。

于 2013-11-01T07:32:51.277 回答
0

您可能试图通过在数组衰减为指针且 sizeof 仅返回指针大小的函数中使用 sizeof 来获取数组的大小。

于 2013-11-01T06:47:13.597 回答