0

程序应根据输入创建字符串。我们想将这些字符串添加到一个列表中,该列表作为指针传递给函数(指向其他 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,";

等等它确实在没有任何警告的情况下编译

我们做错了什么?谢谢

4

2 回答 2

3

好吧,既然configurations是 a char **,那么configurations[n]是 a char *configurations[n][m]然后应该是 a char。您正在尝试将 a 分配char *给 a 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 上,这似乎没问题),您也不会检查...

于 2013-06-05T14:13:18.870 回答
2

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

所以:

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

应该:

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

和其他地方的相同类型的图案。

于 2013-06-05T14:12:04.483 回答