此应用程序的目的是使用多指针
创建NxN变量/用户定义的数组整个"数组"(修辞手法)完全填满,
然后一个函数将行中的所有数字相加,并在一个新的"数组"中找到存储在其中的每一行的总和,该数组正在返回(我的意思是指向它的指针)
您不可能返回整个数组,对吗?
我知道scanf()
是邪恶的(呵呵),如果这是问题,我会把它改成fgets()
atoi()
!
几个有效输入后,它会崩溃!!
PS 33 E:\ask1.c [警告] 赋值使指针成为没有强制转换的整数
#include <stdio.h>
#include <stdlib.h>
int* linesum(int **ar);
main()
{
int n,i,j,*temp,SIZE;
printf("Input Array Dimensions NxN ");
scanf(" %d",&SIZE);
int **Table=(int**)malloc(SIZE*sizeof(int*));
for(i=0;i<SIZE;i++)
*(Table+i)=(int*)malloc(SIZE*sizeof(int));
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++){
printf("Input int of %d row %d column ",i,j);
scanf(" %d",*(Table+i*SIZE+j));
}
temp=linesum(Table,SIZE);
for(i=0;i<SIZE;i++)
printf("Sum of line %d is %d",i,*(temp+i));
return 0;
}
int* linesum(int **ar,int N)
{
int i,j,lsum=0;
int *new=malloc(N*sizeof(int));
for(i=0;i<N;i++){
for(j=0;j<N;i++)
lsum+=*(ar+i*N+j);
*(new+i)=lsum;
}
return (new);
}
当你写Table+i*SIZE+j
的东西时,你假设你的"二维数组"是连续存储在内存中的。不是。您没有分配数组来保存 N*M 个元素。您创建了 N 个数组来保存每个数组的 M 个元素。这些 N 个数组中的每一个都有一个不同的(几乎可以肯定是不连续的)起始地址。
索引此数组数组的正确方法是 Table[i][j]
。
要在不使用[]
的情况下对其进行索引(按照 OP 在下面的评论中的要求),您可以编写 *(*(Table + i) + j)
.我不建议这样做,因为它的可读性比Table[i][j]
差得多。
更改:
scanf(" %d",*(Table+i*SIZE+j));
自:
scanf(" %d",&Table[i][j]);
但是,您的主要问题是使用sizeof(ar)
。
不能在指向数组的指针上使用sizeof
来获取实际数组长度。
恐怕你将不得不找到更好的方法(只需从调用函数发送SIZE
)。
此外,您需要在打印结果后调用free(temp)
。
最后,不要使用new
。这在C++中是一个保留字,除了它令人困惑之外,如果你把这段代码移植到C++,它将无法编译。