尝试将每个字符串转换为整数,并将每个元素存储到int**中



我有一个类型为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_1num_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);

最新更新