动态分配扫号失败
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==3
和 c==4
然后它开始询问 12 的第 10 个元素然后它崩溃说 filename.exe 已停止工作。
根据我的经验,我认为这与 scanf()
功能有关。我也尝试过在 scanf
、scanf("%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**
#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()
的后一种情况没有出现任何问题,程序按预期运行。
这是错误的
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**