C:malloc和strcpy之间的字符串被破坏了

时间:2013-11-01 06:44:15

标签: c malloc strtok strlen strcpy

我很困惑,为什么会发生这种情况,尽管我之前已经使用过这样的陈述。我正在将一个字符串复制到其他字符串中,即使在调用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);

3 个答案:

答案 0 :(得分:3)

根据strlen()手册:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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