我现在必须尝试过20种方法。我真的需要帮助,无论我做什么,我都会收到与此类似的错误。
a value of type "int" cannot be used to initialize an entity of type "int (*)[30]"
即。这会给我带来这样的错误
int(*array)[160] = malloc((sizeof *array) * 10);
并做这样的事情
int** Make2DintArray(int arraySizeX, int arraySizeY) {
int** theArray;
theArray = (int**) malloc(arraySizeX*sizeof(int*));
int i;
for (i = 0; i < arraySizeX; i++)
{
theArray[i] = (int*) malloc(arraySizeY*sizeof(int));
}
return theArray;
}
会告诉我这个
"void *(size_t)" in "memory.c" at line 239 and: "int()"
有没有人有解决方案如何成功分配2dArray的int [160] [10]
答案 0 :(得分:17)
试试这个:
int **array;
array = malloc(rows * sizeof(int *));
for (i = 0; i < rows; i++)
array[i] = malloc(cols * sizeof(int));
// Some testing
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++)
array[i][j] = 0; // or whatever you want
}
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++)
printf("%d ", array[i][j]);
}
在你的情况下,行= 160和cols = 10.是一种可能的解决方案。
使用这种方法,您可以使用两个索引:
答案 1 :(得分:12)
这两个编译对我来说都很好。如果您在使用在相同内容中声明的函数(例如#include <stdlib.h>
)之前忘记 malloc(size_t)
,那么第一个错误很常见,我做了不忘了做。
C有一些有趣的编译时行为,其中包括调用以前从未见过的函数的能力(既不是原型定义也不是实现)。在遇到这样的呼叫时,C假设该功能是:
int
例如,该函数隐式假定为以下形式:
int func();
通常你甚至都不会注意到,除了你的编译器发出的警告报告的效果:
Warning: implicit declaration of `func` assumed to return `int`
如果你是在球上,那么你的警告级别会出现警告 - 启用错误并且会抓住这个。
但是如果你不这样做呢?如果函数返回的“东西”不能用实现int
中的数据大小来表示内容呢?例如,如果int
是32位,但数据指针是64位,该怎么办?例如,假设{<1}}在某些头文件中声明,您不包括,并在您编译并链接到您的程序的.c文件中实现,如下所示:< / p>
char *get_str()
好吧,编译器应该呕吐,告诉你#include <stdio.h>
// Note: NO prototype for get_str
int main()
{
char *s = get_str();
printf("String: %s\n", s);
return 0;
}
和int
不兼容(在警告你char*
之后不久就会返回get_str
)。但是,如果你通过告诉它以某种方式int
强迫编译者的手:
char*
现在,在没有启用警告的情况下,您将获得隐式声明警告,就是这样。代码将编译。但它会运行吗?如果#include <stdio.h>
// Note: NO prototype for get_str
int main()
{
char *s = (char*)get_str(); // NOTE: added cast
printf("String: %s\n", s);
return 0;
}
!= sizeof(int)
,(32位与64位)可能不会。从sizeof(char*)
返回的值是64位指针,但调用者假设只返回32位,然后强制它为64位指针。简而言之,演员隐藏了错误并打开了潘多拉的未定义行为框。
那么所有这些与你的代码有什么关系呢?通过不包括get_str
,编译器不知道<stdlib.h>
是什么。所以它假定它的形式为:
malloc
然后,通过将结果转换为int malloc();
,您告诉编译器“无论如何,请将其设为(int**)
”。在链接时,找到int**
(没有像C ++这样的名称修改的参数签名),已连接,并且您的程序已准备就绪。但是在你的平台_malloc
和数据指针不相同的大小,因此你最终会产生一些不良后果:
int
的实现上编译,代码将表现出正常行为。所以你在你的32位Debian盒子上构建它,一切看起来都很好。你把你的作业转交给在他的64位Mac上构建它的教授,它会崩溃,你没有完成作业,没有上课,辍学,并且在接下来的十年里一直在抚摸猫,同时看着Seinfeld在你母亲的地下室重播想知道出了什么问题。哎哟。
不要像某些银弹一样对待铸造。事实并非如此。在C中,需要远比人们使用它更少,如果在错误的地方使用,可以隐藏灾难性错误。如果你在代码中找到一个点,如果没有硬编译就无法编译,再看一遍。除非你是绝对的,否则确定演员是正确的事情,可能是错误。
在这种情况下,它隐藏了真正的错误,你忽略了为编译器提供足够的信息以了解sizeof(int) == sizeof(int**)
真正做了什么。
答案 2 :(得分:5)
分配数组:
int *array = malloc(sizeof(int) * 160 * 10);
然后使用代码:
array[10 * row + column] = value;
(其中row
从0到159(含),column
从0到9(包括0和9)。)
答案 3 :(得分:0)
我有一份关于rendon答案的说明:
对于他的代码,Visual C ++对每个“=”操作说:error C2440: '=' : cannot convert from 'void *' to 'int **'
通过进行一些更改,它对我有用,但我不确定它是否也一样,所以我害怕编辑他的代码。相反,这是我的代码,似乎适用于第一印象。
int **a;
a = (int **)malloc(rows * sizeof(int));
for (i = 0; i < rows; i++)
{
a[i] = (int *)malloc(cols * sizeof(int));
}
for (j=0;j<rows;j++)
{
for (i=0;i<cols;i++)
{
a[i][j] = 2;
}
}
实际上,我是使用自定义struct
代替int
进行的,但我认为无论哪种方式都可行。
答案 4 :(得分:0)
别介意我,我只是使用calloc
添加一个例子void allocate_fudging_array(int R, int C)
{
int **fudging_array = (int **) calloc(R, sizeof(int *));
for(int k = 0; k < R; k++)
{
fudging_array[k] = (int*) calloc(C, sizeof(int));
}
}
// a helper function to print the array
void print2darr(int **arr, int R, int C)
{
for(int i = 0; i < R; i++)
{
for(int j = 0; j < C; j++)
{
printf(" %d ", arr[i][j]);
}
printf("\n");
}
}
答案 5 :(得分:-1)
用于存储 char *
的2D数组char ***array;
int rows = 2, cols = 2, i, j;
array = malloc(sizeof(char **)*rows);
for (i = 0; i < rows; i++)
array[i] = malloc(cols * sizeof(char *));
array[0][0] = "asd";
array[0][1] = "qwe";
array[1][0] = "stack";
array[1][1] = "overflow";
for(i=0;i<rows;i++){
for(j=0;j<cols;j++){
printf("%s ",array[i][j]);
}
printf("\n");
}