我正确地为C中的指针数组分配内存吗?

时间:2014-01-13 13:48:42

标签: c arrays pointers malloc

我正在尝试追踪一个大项目的错误。我认为这是由于我如何将数组传递给我的函数。我这样做了吗?

main(){
    int *x = declarArray(x, 100);
    int *y = declarArray(x, 100);

    // lines of code....

    x = arrayManip(x, 100);

    // more code...

    int i;
    for(i=0; i<100; i++)
        y[i] = x[i];

    //more code...

    free(x);
    free(y);

}

这是我操作数组的方式:

int *arrayManip(int *myarray, int length){
    int i;
    for(i=0; i<length; i++)
        myarray[i] = i;
    return array;
}

这是我初始化数组的方法:

int* declareArray(int *myarray, int length){
    myarray = (int*) malloc(length*sizeof(int*));
    if (myarray==NULL)
        printf("Error allocating memory!\n");
    int i;
    for(i=0; i<length; i++)
        myarray[i] = -888;
    return myarray;
}

这段代码似乎在小范围内正常工作,但是一旦我有更多大尺寸的数组经常会来回传递并复制到我的程序中,可能会出现问题?

4 个答案:

答案 0 :(得分:3)

declarArray:

  1. 名称不是正确的
  2. 该功能的名称不是它的功能
  3. malloc with sizeof(int *),而不是sizeof(int)。担保是64位机器的错误
  4. malloc失败,您打印,但仍然写入null
  5. 传递myarray作为参数是一个noop,因为
  6. -888是一个神奇的数字
  7. 没有任何错误检查
  8. 我的建议。扔掉它并重新开始

答案 1 :(得分:1)

不,按照我的理解。 你分配了一个暗淡的数组=&gt;该数组中的元素应该是整数而不是指向整数的指针,而不是:

myarray = (int*) malloc(length*sizeof(int*));

它应该是:

myarray = (int*) malloc(length*sizeof(int));

在函数arrayManip中传递名为array的param,而不是尝试将其作为myarray访问

答案 2 :(得分:0)

此:

myarray = (int*) malloc(length*sizeof(int*));

将一个length指针数组分配给一个整数,然后将其放入指向整数的指针(即整数数组,而不是指向整数的指针)。如果你想要一个整数数组,你想要:

myarray = (int*) malloc(length*sizeof(int));

或(如果你想将其归零):

myarray = (int*) calloc(length, sizeof(int));

进行尺寸x长度计算本身。

要分配指向整数的指针列表,您需要:

myarray = (int**) malloc(length*sizeof(int*));

myarray = (int**) calloc(length, sizeof(int*));

除非你非常关注速度,否则我发现使用calloc()可以减少未初始化数组的错误,并使得分配大小的原因更加明显。

答案 3 :(得分:-1)

指针的字大小为[2或4,......取决于机器架构]。无论它指向int,double,float,......

对于整数指针,如果机器中的int需要4个字节,则它可以工作。当你去寻找其他数据类型时,它会引导你出错。

你应该将记忆分配为

pointer = (DataType*) malloc (length * sizeof(DataType));

使用malloc并使代码清晰。

 void* malloc (size_t size);

malloc reference

使用memset为您的数组分配默认值[-888]。

void *memset(void *str, int c, size_t n)