C语言 变量(int 指针指向 int 指针 int,(int 数组的 int),一旦存储了一些输入就会崩溃



此应用程序的目的是使用多指针
创建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++,它将无法编译。

相关内容

  • 没有找到相关文章

最新更新