C中动态大小的字符串

时间:2013-01-29 23:09:56

标签: c string dynamic realloc strcat

我有以下代码,并编辑我将在我正在创建的程序中处理的“路径”的字符串。

我的问题是我的代码有效,但我不知道为什么或更清楚我不明白为什么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;
    }

5 个答案:

答案 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的末尾,这对我来说是错误的)