动态分配扫号失败

Dynamic allocation failing to scan number

#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() 的后一种情况没有出现任何问题,程序按预期运行。

这是错误的

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

应该是

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

或者因为 ptr 指向地址,你不应该解引用指针然后传递地址,只是

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

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

此外,这不是我第一次看到 scanf() 忽略 return 值,如果您键入字符串,则会发生崩溃。

您应该确保使用

读取了一个整数
if (scanf("%d", &(*(ptr + i * c + j))) == 1)

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

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

是危险的!

&ptr* 包含指向 ptr 第一个元素的指针的地址,而不是第一个元素的地址!

您需要的只是ptr + (i*c +j),或&(ptr[i*c+j])

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