我有以下代码,并编辑我将在我正在创建的程序中处理的“路径”的字符串。
我的问题是我的代码有效,但我不知道为什么或更清楚我不明白为什么strcat
允许src
附加到dest
。因为一切都在使用动态字符串,所以我不应该realloc dest
。但是当我尝试时,realloc
失败
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv) {
char *src = argv[1];
char *dest = argv[2];
char *d_basedir;
int s_length = strlen(src);
printf("dest starts as %s: length %zu\n", dest, strlen(dest));
printf("src starts as %s: length %zd\n", src, strlen(src));
if(!(src[s_length - 1] == '/')) {
if((d_basedir = strrchr(src, '/')+1) != NULL) {
printf("basedir is %s\n", d_basedir);
strcat(dest, d_basedir);
printf("dest changed to %s: length %zd\n", dest, strlen(dest));
}
}
printf("dest ends as %s: length %zd\n", dest, strlen(dest));
return 0;
}
答案 0 :(得分:1)
托管环境为您提供argv[]
数组,但您没有分配此内存,因此您不应尝试重新分配它。你根本不应该真正修改argv[]
。如果您想进行修改,请首先复制字符串(使用malloc
等),然后至少可以确定您是否有足够的空间或是否需要先使用realloc
串接。
答案 1 :(得分:0)
strcat(dest, d_basedir);
实际上相当于:
strcat(argv[2], d_basedir);
并且它是未定义的行为。它今天可能有用,明天也有用。您有权写入argv[2][0]
最多argv[2][strlen(argv[2])]
,但写过该元素(您在strcat
调用时所执行的操作)是未定义的行为。
答案 2 :(得分:0)
因为你很幸运。这就是全部; - )
通过附加到dest,你会覆盖你的程序已经分配的一些内存,但它不会将它用于任何重要的事情。这就是为什么它“有效”。
您无法重新分配malloc未分配的内存。传递给main()的参数是内存的这些部分之一。
你想要的是malloc新内存足够新的路径,然后strcpy和strcat你需要它。
答案 3 :(得分:0)
strcat
不关心dest
。它只是一个指向char的指针,对于strcat来说就足够了。
由于argv[2]
来自环境,因此不允许添加到dest(argv [2])。正确的方法是分配足够的内存,将argv[2]
复制到其中并将d_basedir
附加到该
char *dest = malloc(strlen(argv[2]) + strlen(d_basedir) + 1);
strcpy(dest, argv[2]);
strcat(dest, d_basedir);
答案 4 :(得分:0)
我个人不会将realloc / malloc用于此类代码。
您可以使用PATH_MAX(或在某些情况下MAX_PATH)来确定您需要的最长路径。
char dest[PATH_MAX];
strcpy(dest, d_basedir);
strcat(dest, argv[2]);
(这与你所写的略有不同,它将src-path的d_basedir附加到dest的末尾,这对我来说是错误的)