将char []添加到char **(字符串到字符串列表)

时间:2013-06-05 13:56:51

标签: c string pointers

程序应根据输入创建字符串。我们想要将这些字符串添加到列表中,该列表作为指针(传递给其他char *指针)传递给函数。 代码如下所示:

void main(void) {
    //set angles alpha (small) & beta (large)
    char ** configurations = calloc(0, sizeof(char*));
    int multiplicity = 0;

    createConfigString(4, 4, 0, configurations, 0, &multiplicity);
}

void createConfigString(int a, int b, int c, char ** configurations, int start, int * multiplicity) {
int x, i;
int strSize = 2 * (a + b + c);

for(x = a; x >= (a + (a % 2)) / 2; x--) {
    //new entry to configurations if starting a new line
    if(start == 0) {
        configurations = realloc(configurations, (*multiplicity + 1) * sizeof(char *));
        configurations[*multiplicity] = calloc(strSize, sizeof(char));
    }
    for(i = 0; i < x; i++) {
        configurations[*multiplicity][start] = "a,";
    }
    if(b == 2) {
        *multiplicity++;
        configurations[*multiplicity][start + 2 * x] = "b,b\n";
        start = 0;
        continue;
    }
    configurations[*multiplicity][start + 2 * x] = "b,b,";
    createConfigString(a - x, b - 2, c, configurations, start + 2 * x + 4, multiplicity);
}
}

但是在编译时它会告诉我们它正在尝试将指针转换为行

中的int
configurations[*multiplicity][start] = "a,";
configurations[*multiplicity][start + 2 * x] = "b,b\n";
configurations[*multiplicity][start + 2 * x] = "b,b,";

当我们写

configurations[*multiplicity][start] = (int) "a,";

等。它编译时没有任何警告

我们做错了什么?感谢

2 个答案:

答案 0 :(得分:3)

好吧,既然configurationschar **,那么configurations[n]就是char *,而configurations[n][m]则应该是char 。您正在尝试将char *分配给char,为此,编译器必须将指针转换为整数类型,然后将其截断为char尺寸。这通常不是编码员想要的,所以它会产生警告,让你知道你可能做错了什么。投入使用告诉编译器“是的,我真的想这样做,所以不要警告我”。但是,它可能仍然没有按照你的想法做到......

另外,这个:

char ** configurations = calloc(0, sizeof(char*));

可能存在问题。 Linux上calloc的手册页有这样的说法:

If nmemb or size is 0, then calloc() returns either NULL, or
a unique pointer value that can later be successfully passed to free().

由于您没有检查返回值,因此可能会将NULL指针传递给createConfigString。也许您当前的平台实际上返回一个“可用”值,但它不会是可移植的。在确实返回NULL的情况下,后面的realloc可能会出现问题(虽然在Linux上,似乎没问题),你也不会检查......

答案 1 :(得分:2)

您不能使用=复制字符串,必须使用函数 - 例如标准strcpy函数。

所以:

    configurations[*multiplicity][start] = "a,";

应该是:

    strcpy(configurations[*multiplicity][start], "a,");

其他地方也有同样的模式。