指向指针阵列和指针的指针Stack Smashing错误

时间:2017-07-17 07:40:38

标签: c arrays pointers

我需要用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()?谢谢。

1 个答案:

答案 0 :(得分: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下一个整数的当前位置。在每个循环中,我们增加位置。

当然,您需要检查这些scanfmalloc的返回值;也许read应该有不同的原型,例如

int *read(int *array_size);

因此它可以直接返回指向数组的指针,或者在出错时返回NULL。