为什么strcat的结果为空

火星Eclipse
char* path = malloc(128);
path = "/bin/"
char* path2 = malloc(128);
path2 = "ls"
strcat(path,path2);
fprintf(stderr, "%s\n",path);

结果为空。

但是如果我用

char path[128] = "/bin/";
char* path2 = malloc(128);
path2 = "ls"
strcat(path,path2);
fprintf(stderr, "%s\n",path);

char path [128]和malloc有什么区别?

苏拉夫·戈什(Sourav Ghosh)

在下面的代码中

char* path = malloc(128);
path = "/bin/";                   //added ;, you're overwriting the returned pointer
char* path2 = malloc(128);
path2 = "ls";                     // same as above
strcat(path,path2);               // the destination buffer is non-modifiable!!
fprintf(stderr, "%s\n",path);

你基本上覆盖由分配器函数返回的内存(指针),以及使这些指针指向字符串文字。strcat()因此,调用会调用未定义的行为,因为目标缓冲区是不可修改的(因为它们是字符串文字)。这会调用未定义的行为

第二个片段的问题较少

char path[128] = "/bin/";   // this is to be used as destination, OK
char* path2 = malloc(128);
path2 = "ls";               // you wouldn't need malloc here            
strcat(path,path2);
fprintf(stderr, "%s\n",path);

在这里,您正在分配足够大的数组(该数组可以修改,并且可以用作的合法目标缓冲区strcat()),因此从这个角度来看,您还可以。但是,对于第二个参数,您将再次覆盖所返回的指针malloc(),从而导致内存泄漏。您无需在malloc()这里使用,只需将文字分配给指针并将其用作strcat()调用中的第二个参数

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章