我有一个类型为int**
的对象,我想用原来是字符串的整数填充它,在本例中,用原来是串"1234"
的整数1234
填充它。
int** num_list = malloc(10*sizeof(int*));
for(int i=0; i<10; i++) {
num_list[i] = atoi("1234");
}
free(num_list);
我得到的错误/警告是assignment makes pointer to integer without a cast [-Wint -conversion]
。我对C语言还是个新手,在各种尝试都失败后,我想问一下,为什么会发生这种情况,以及如何在没有问题的情况下工作?我不能更改列表的类型,它需要保持为int**
,因为我所有的工作都依赖于这种类型,我不能将其更改为其他类型。
您可以这样做:
int** num_list_1 = malloc(10*sizeof(int*));
for(int i=0; i<10; i++) {
num_list_1[i] = malloc(sizeof int);
num_list_1[i][0] = atoi("1234");
}
for(int i=0; i<10; i++) {
free(num_list_1[i]);
}
free(num_list_1);
或者你可以这样做:
int** num_list_2 = malloc(10*sizeof(int*));
num_list_2[0] = malloc(10*sizeof(int));
for(int i=1; i<10; i++) {
num_list_2[i] = NULL;
}
for(int i=0; i<10; i++) {
num_list_2[0][i] = atoi("1234");
}
注意,在第一个例子中,密钥分配是
num_list_1[i][0] = atoi("1234");
而在第二个例子中它是
num_list_2[0][i] = atoi("1234");
写第一个(而不是第二个(示例的另一种方法是
*num_list_1[i] = atoi("1234");
第一个例子在内存中是这样的:
+---+
num_list_1: | * |
+-|-+
|
v
+---+ +------+
| *----> | 1234 |
+---+ +------+ +------+
| *-----------------> | 1234 |
+---+ +------+ +------+
| *----> | 1234 |
+---+ +------+
.
.
.
+---+ +------+
| *----> | 1234 |
+---+ +------+
第二个例子如下:
+---+
num_list_2: | * |
+-|-+
|
v
+---+ +------+------+------+ +------+
| *----> | 1234 | 1234 | 1234 | ... | 1234 |
+---+ +------+------+------+ +------+
| 0 |
+---+
| 0 |
+---+
.
.
.
+---+
| 0 |
+---+
请注意,在每种情况下,num_list_1
和num_list_2
都指向指针的数组,而这些二级指针中的每一个实际上都指向一个int
(或者在num_list_2
的情况下指向几个int
(。
如果你可以使用int *
(就像SlLoWre的回答一样(,它看起来是这样的:
+---+ +------+------+------+ +------+
num_list: | *----> | 1234 | 1234 | 1234 | ... | 1234 |
+---+ +------+------+------+ +------+
但是,如果你想要这张照片,num_list
必须是int *
,而不是int **
。
使用int **
的要求似乎很奇怪。我可以想象使用int **
的唯一原因是,如果您使用一个函数来构造数组,并且该函数通过引用返回指针。看起来是这样的:
void allocate_array(int **num_list_p)
{
*num_list_p = malloc(10*sizeof(int*));
for(int i=0; i<10; i++) {
(*num_list_p)[i] = atoi("1234");
}
}
int main()
{
int *num_list;
allocate_array(&num_list);
for(int i = 0; i < 10; i++) {
printf("%d: %dn", i, num_list[i]);
}
}
还有最后一件事:您可能知道这一点,但在实际代码中,我们总是检查malloc
的返回值,以确保它不是NULL
。
您不需要使用int**(指向指针的指针(,只需使用int*
int* num_list = malloc(10*sizeof(int));
for(int i=0; i<10; i++) {
num_list[i] = atoi("1234");
}
free(num_list);