程序应该根据输入创建字符串。我们希望将这些字符串添加到一个列表中,该列表将作为指针传递给函数(指向其他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,";等,它会在没有任何警告的情况下编译。
我们做错了什么?谢谢
发布于 2013-06-05 22:13:19
既然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().由于不检查返回值,因此可能会将空指针传递到createConfigString中。也许您当前的平台实际上返回了一个“可用”值,但它将不是可移植的。在它返回NULL的情况下,可能是后来的realloc可能有问题(尽管在Linux上,它看起来是可以的),这也不需要检查……
发布于 2013-06-05 22:12:04
你不能使用=复制字符串,你必须使用一个函数--比如标准的strcpy函数。
所以:
configurations[*multiplicity][start] = "a,";应该是:
strcpy(configurations[*multiplicity][start], "a,");和其他地方相同类型的模式。
https://stackoverflow.com/questions/16941904
复制相似问题