#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==3
和c==4
,那么它会询问12个元素中的第10个元素,然后它会崩溃,说filename.exe已经停止工作。
根据我的经验,我认为这与scanf()
函数有关。我也尝试过在scanf
,scanf("%d",ptr +(i*c +j))
中不使用&,但当它读取第一个元素时就会崩溃。
在我编写的另一个简单得多的程序中,scanf()
的后一种情况没有出现任何问题,程序按预期运行。
3条答案
按热度按时间s71maibg1#
这是不对的
应该是
或者,因为
ptr
指向地址,所以不应该解引用指针然后传递地址,只需在你的代码中,你传递的是指针
ptr
的地址加上i * c + j
,这可能是一个无效的地址,因此发生了分段错误。而且,这不是我第一次看到
scanf()
的返回值被忽略,如果你输入一个字符串,那么就会发生崩溃。应确保读取的整数是
如果条件为false,则不读取任何值,例如,如果键入文本而不是数字。
pxiryf3j2#
在第二个
scanf()
中,"%d"
期望int*
类型的格式,即指针,但我看到您正在将指针的地址作为&ptr+(i*c+j)
传递,即int**
。t9aqgxwy3#
危险!
&ptr*
包含指向ptr
的第一个元素的指针的地址,而不是第一个元素的地址!您需要的只是
ptr + (i*c +j)
或&(ptr[i*c+j])
。