2017-07-17 56 views
1

我需要分配一个malloc数组,我必须从输入读取一些数字。这是我的代码:指针指针数组&堆栈粉碎错误

#include <stdio.h> 
#include <stdlib.h> 

void read(int **array, int *array_size) 
{ 
    int *tmp; 
    int i; 
    scanf("%d", array_size); 
    *array=malloc(*array_size*sizeof(int)); 
    tmp=malloc(*array_size*sizeof(int)); 
    for(i=0;i<*array_size;i++) 
    { 
     scanf("%d", &tmp[i]); 
     array[i]=&tmp[i]; 
    } 
} 

//DO NOT EDIT main() 
int main() 
{ 
    int *array; 
    int array_size,i; 

    read(&array,&array_size); 

    printf("Print array:\n"); 
    for(i=0;i<array_size;i++) 
     printf("%d\n", array[i]); 

    return 0; 
} 

它有点儿工作,但显示值之后它显示了一个堆栈溢出检测(我使用GCC编译它)。

我认为问题是*array=malloc(*array_size*sizeof(int)),但我不知道如何解决它。有没有另一种方式来分配这个数组而不编辑main()?谢谢。

+0

Array_size甚至没有初始化... –

+2

顺便说一下'#include'是MCVE绝对必需的。缺少'''malloc'将会在64位平台上出现严重错误。 –

+0

@TonyTannous考虑scanf成功.....没关系。 –

回答

4

问题是你索引错误数组。你应该写(*array)[i],不array[i]

void read(int **array, int *array_size) 
{ 
    int *tmp; 
    int i; 
    scanf("%d", array_size); 
    *array=malloc(*array_size*sizeof(int)); 
    tmp=malloc(*array_size*sizeof(int)); 
    for(i=0;i<*array_size;i++) 
    { 
     scanf("%d", &tmp[i]); 
     (*array)[i]=tmp[i]; 
    } 
} 

当然,这一切都是非常复杂的 - 你不必实际上有tmp,你也不需要malloc它。相反,你很可能会做这样的事情

void read(int **array, int *array_size) { 
    int i, *pos; 
    scanf("%d", array_size); 
    *array = pos = malloc(*array_size * sizeof(int)); 
    for (i = 0; i < *array_size; i ++, pos ++) { 
     scanf("%d", pos); 
    } 
} 

这是我们拥有的指针pos指向我们想要scanf下一个整数数组中的当前位置。在每个循环中,我们增加位置。

当然,你想要检查这些scanf s和malloc的返回值;或许read应该有不同的原型,如

int *read(int *array_size); 

,因此它可以将指针返回到直接在阵列,或关于错误NULL。