gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:22 26 4
gpt4 key购买 nike

我需要使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com