#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()
功能有关。我也试过没有&amp;在scanf
,scanf("%d",ptr +(i*c +j))
但是一旦它读取第一个元素就会崩溃。
在我编写的另一个更简单的程序中,检查scanf()
后一种情况并没有出现任何问题,程序按预期运行。
答案 0 :(得分:0)
这是错误的
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,则不读取任何值,例如,如果键入文本而不是数字。
答案 1 :(得分:0)
scanf("%d",&ptr+(i*c+j));
很危险!
&ptr*
包含指向ptr
第一个元素的地址,而不是第一个元素的地址!
您需要的只是ptr + (i*c +j)
或&(ptr[i*c+j])
。
答案 2 :(得分:0)
在第二个scanf()
"%d"
期望格式int*
即指针,但我看到你将指针的地址作为&ptr+(i*c+j)
传递,{{1 }}