我只是分配一个字符串数组(2D char
数组),但它不能很好地工作......
我从编译器那里得到了这个诊断:
warning: assignment makes integer from pointer without a cast [enabled by default]
error: invalid type argument of unary '*' (have 'int')
以下是代码:
char **a, b, result;
scanf("%d", &couples_n);
a = malloc(couples_n * sizeof(char*));
for (i = 0; i < couples_n; i++) {
*(a + i) = malloc((MAX_N + 1) * sizeof(char));
}
b = malloc(couples_n * sizeof(char*));
for (i = 0; i < couples_n; i++) {
*(b + i) = (malloc((MAX_N + 1) * sizeof(char));
}
result = malloc(couples_n * sizeof(char*));
Size = N * 2 + 4;
for (i = 0; i < couples_n; i++) {
*(result + i) = (char*)malloc(Size * sizeof(char));
}
答案 0 :(得分:4)
您忘记在<stdlib.h>
声明malloc
。请注意,您只会收到第一个malloc
的此警告。第二个malloc
上无用的强制转换实际上阻止了编译器诊断可疑的隐式转换。这就是你不应该在C中强制转换malloc
的原因。使用目标类型的大小而不是明确指定类型也更安全,这样你就不需要更新代码了如果目的地类型改变。
以下是更正后的版本:
result = malloc(couples_n * sizeof(*result));
Size = N * 2 + 4;
for (i = 0; i < couples_n; i++) {
result[i] = malloc(Size * sizeof(*result[i]));
}
修改强>
问题实际上更深刻:定义
char** a, b, result;
将a
定义为指向char
指针数组的指针,但将b
和result
指定为简单char
变量。将*
添加到类型中是一个坏习惯:它使您认为类型为char**
,而在C中,在单个定义中定义的每个变量都可以具有不同的间接级别。将*
添加到变量名称,并正确定义它们。
更改定义并以这种方式简化代码:
char **a, **b, **result;
scanf("%d", &couples_n);
a = malloc(couples_n * sizeof(*a));
for (i = 0; i < couples_n; i++) {
a[i] = malloc((MAX_N + 1) * sizeof(*a[i]));
}
b = malloc(couples_n * sizeof(*b));
for (i = 0; i < couples_n; i++) {
b[i] = malloc((MAX_N + 1) * sizeof(*b[i]));
}
result = malloc(couples_n * sizeof(*result));
Size = N * 2 + 4;
for (i = 0; i < couples_n; i++) {
result[i] = malloc(Size * sizeof(*result[i]));
}
请注意,您没有发布可编辑示例甚至是完整函数:我们仍然不知道您如何声明couples_n
,i
或Size
。这些定义可能与您的使用不一致。