C语言 动态分配扫描号失败

wn9m85ua  于 2023-03-28  发布在  其他
关注(0)|答案(3)|浏览(112)
#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()函数有关。我也尝试过在scanfscanf("%d",ptr +(i*c +j))中不使用&,但当它读取第一个元素时就会崩溃。
在我编写的另一个简单得多的程序中,scanf()的后一种情况没有出现任何问题,程序按预期运行。

s71maibg

s71maibg1#

这是不对的

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,则不读取任何值,例如,如果键入文本而不是数字。

pxiryf3j

pxiryf3j2#

在第二个scanf()中,"%d"期望int*类型的格式,即指针,但我看到您正在将指针的地址作为&ptr+(i*c+j)传递,即int**

t9aqgxwy

t9aqgxwy3#

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

危险!
&ptr*包含指向ptr的第一个元素的指针的地址,而不是第一个元素的地址!
您需要的只是ptr + (i*c +j)&(ptr[i*c+j])

相关问题