c - 指向指针数组的指针和 Stack Smashing 错误

标签 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() 的情况下分配这个数组?谢谢。

最佳答案

问题是您索引的错误 数组。你应该写 (*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 应该有一个不同的原型(prototype),例如

int *read(int *array_size);

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

关于c - 指向指针数组的指针和 Stack Smashing 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45138527/

相关文章:

c++ - 有没有办法在 GTK3 应用程序中拥有 OpenGL 上下文?

c++ - 将数组本地抛出到 try block

java - 如何将字符串中的字符转换为数字(转换为电话号码)?

c - int 指针类型转换失败

c - 帮助弄清楚制作文件路径字符串

c - 从管道读取后程序不会停止

c - 为什么此代码包含 case 0 和 default?

c - 多维数组和指向指针的指针

C++双指针成员访问

c - 传递指针结构