gpt4 book ai didi

c - 动态分配扫描失败数量

转载 作者:行者123 更新时间:2023-11-30 17:22:46 25 4
gpt4 key购买 nike

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

main(){
int *ptr,r,c,i,j,min;
printf("Give me the size of rows and columns\n");
scanf("%d%d",&r,&c);
int mini[r];
ptr=(int*)malloc(r*c*sizeof(int));
if(ptr== NULL){
printf("Memory not allocated");
}
else{

for(i=0;i<r;i++){
for(j=0;j<c;j++){
printf("Give me the value ");

scanf("%d",&ptr+(i*c+j));
}
}

for(i=0;i<r;i++){
min=*(ptr+i*c);
for(j=0;j<c;j++){
if (*(ptr+i*c)<min){
min = *(ptr+i*c);
}
mini[i]=min;
}
}
for(i=0;i<r;i++){
printf("%d",mini[i]);

}
free(ptr);

}
}

它毫无问题地获取行和列(r 和 c )值,但一旦我到达扫描分配的内存元素的位置,它就会崩溃。例如,如果我设置 r==3c==4 那么它会询问 12 中的第 10 个元素,然后崩溃,说 filename.exe 已停止工作。

根据我的经验,我认为这与 scanf() 函数有关。我也尝试过在 scanf 中不使用 &,scanf("%d",ptr +(i*c +j)) 但一旦它出现就会崩溃读取第一个元素。

在另一个更简单的程序中,我编写了检查它的 scanf() 的后一种情况没有出现任何问题,并且程序按预期运行。

最佳答案

这是错误的

scanf("%d",&ptr+(i*c+j));

应该是

scanf("%d", &(*(ptr + i*c + j)));

或者因为ptr指向地址,所以您不应该取消引用指针然后传递地址,只需

scanf("%d", ptr + i*c + j);

在您的代码中,您传递的是指针ptr的地址,该地址增加了i * c + j,这可能是一个无效地址,因此会发生段错误.

此外,这不是我第一次看到 scanf() 的返回值被忽略,如果您输入字符串就会发生崩溃。

您应该确保读取的是整数

if (scanf("%d", &(*(ptr + i * c + j))) == 1)

如果条件为 false,则不会读取任何值,例如,如果您键入文本而不是数字。

关于c - 动态分配扫描失败数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27888989/

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