动态分配无法扫描号码

时间:2015-01-11 15:50:28

标签: c dynamic ansi allocation

#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()功能有关。我也试过没有&amp;在scanfscanf("%d",ptr +(i*c +j))但是一旦它读取第一个元素就会崩溃。

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

3 个答案:

答案 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 }}