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有什么区别?
在下面的代码中
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] 删除。
我来说两句