2013-11-01 26 views
2

我很困惑,为什么会发生这种情况,尽管我以前使用过这样的语句。我将一个字符串复制到其他字符串中,即使在调用strtok之前,我的原始字符串也会被损坏。这是相关的代码片段,在此之后我使用strtok。但在此之前,我看到reference已损坏。C:malloc和strcpy之间的字符串被破坏

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是全球性的,并且正在主要内部建起来。上述代码是一个单独的函数

realloc(reference,strlen(reference) + CHUNK); 
+2

'track = malloc(sizeref + 1)'...您不会为NUL终止符分配空间。除此之外,你的程序还有另一个UB。 'strlen()'返回'size_t'和** not **'int',所以你必须使用'%zu'而不是'%d'来打印。 – 2013-11-01 06:47:05

+1

@ H2CO3你有时候可以节省我这么多该死的打字。我需要在某一天偿还那个恩惠= P – WhozCraig

+0

@WhozCraig:D够公平的。 – 2013-11-01 06:49:44

回答

0

你可能试图通过在函数中使用的sizeof得到数组的大小发生衰变数组的指针和sizeof只返回指针的大小内。

1

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

3

根据手动的strlen():

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

因此,正如上面提到的,你应该分配大小的strlen()+ 1为正确空终止的缓冲器。

+0

是的,这是真的,但如何解决这个问题。我试过strlen()+ 1,结果仍然相同。如果我不使用+1,那么它应该至少分配234个字节,但它停在106 ..这很奇怪。 –

+0

@DiwakarSharma我刚刚用strlen(。)+ 1检查了你问题的一小部分代码,它工作得很好。我得到这样的输出:%所有输入数字%:236 \ n%所有输入数字%:235.这是正确的(第二个strlen给我们236-1)。猜猜,如果你在代码的其他部分有一些错误。所以,如果你仍然在处理这个问题 - 发布一些测试代码(用独立的main(){})包装,尽可能小,并且包含错​​误。那么可以肯定的是,人们会帮助你。 – Michael

+0

那么,我已经改变了我的方法和逻辑,以我感觉更好的方式和逻辑,并已发布针对问题的不同问题。 http://stackoverflow.com/questions/19761453/c-array-of-char-pointers-not-working-as-expected-dynamically –