程序应根据输入创建字符串。我们想要将这些字符串添加到列表中,该列表作为指针(传递给其他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);
}
}
但是在编译时它会告诉我们它正在尝试将指针转换为行
中的intconfigurations[*multiplicity][start] = "a,";
configurations[*multiplicity][start + 2 * x] = "b,b\n";
configurations[*multiplicity][start + 2 * x] = "b,b,";
当我们写
configurations[*multiplicity][start] = (int) "a,";
等。它编译时没有任何警告
我们做错了什么?感谢
答案 0 :(得分:3)
好吧,既然configurations
是char **
,那么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,");
其他地方也有同样的模式。