动态分配字符串数组

时间:2016-01-18 12:17:00

标签: c arrays string char

我只是分配一个字符串数组(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));
}

1 个答案:

答案 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指针数组的指针,但将bresult指定为简单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_niSize。这些定义可能与您的使用不一致。