malloc编译错误:类型为“int”的值不能用于初始化int(*)类型的实体[30]

时间:2012-12-03 05:18:36

标签: c pointers malloc

我现在必须尝试过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]

6 个答案:

答案 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和数据指针相同的大小,因此你最终会产生一些不良后果:

  • 演员隐藏了真正的错误。
  • 虚假指针是由 real 返回指针的一半位制造的。
  • 作为伤口的残酷剂量,分配的内存被泄露,因为在任何引用它的地方都没有有效的指针(你只是通过保留其中的一半来销毁唯一的一个)。
  • 可能大多数不受欢迎,如果在 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");
}