【问题标题】:Variable (int pointer to int pointers to int ,(NxN array of int), crashes once some inputs are stored?变量(指向 int 的 int 指针的 int 指针,(NxN int 数组),一旦存储了一些输入就会崩溃?
【发布时间】:2014-01-15 22:08:06
【问题描述】:

此应用程序的目的是使用多指针创建一个 NxN 变量/用户定义数组
整个“数组”(比喻)被完全填满,
然后一个函数将所有数字相加,并在一个新的“数组”中找到存储在其中的每一行的总和,该数组正在被返回(我的意思是指向它的指针)
不可能返回一个ENTIRE ARRAY,对吗?
我知道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);       
}

【问题讨论】:

    标签: c arrays pointers malloc scanf


    【解决方案1】:

    当您编写Table+i*SIZE+j 之类的内容时,您假设您的“二维数组”连续存储在内存中。 不是。您没有分配一个数组来保存 N*M 个元素。您创建了 N 个数组来分别保存 M 个元素。这 N 个数组中的每一个都有一个不同的(而且几乎可以肯定是不连续的)起始地址。

    索引这个数组的正确方法是Table[i][j]

    要在不使用 [] 的情况下对其进行索引(根据 OP 在下面 cmets 中的要求),您可以编写 *(*(Table + i) + j)。我不推荐这个,因为它比Table[i][j] 可读性差很多。

    【讨论】:

    • 有没有办法用指针连续分配内存?我不允许使用数组索引(我不会因为我现在学习指针:D)
    • 顺便说一句,除了指针运算和索引之外,还有没有办法访问那些非内存连续元素?
    • @niCk 你也可以写*(*(Table + i) + j),但老实说,IMO 很难读懂。要分配单个 NxM 数组,只需说 malloc(SIZE*SIZE*sizeof(int)) 并让 Table 成为 int* 而不是 int**;然后,您可以像在 OP 中那样访问它。
    • @niCk 对于scanf(),您要传递单元格的地址,而不是值,因此删除前导*sscanf("%d", (*(Table + i) + j))
    • @niCk 你的linesum() 函数也坏了;它没有在new 中分配足够的空间。请注意,这里的sizeof(ar) 等价于sizeof(int**),它返回指针的大小,可能是4(如果是32 位机器)或8(如果是64 位机器)。你可能想在这里使用SIZE
    【解决方案2】:

    变化:

    scanf(" %d",*(Table+i*SIZE+j));
    

    收件人:

    scanf(" %d",&Table[i][j]);
    

    然而,您的主要问题是使用sizeof(ar)

    您无法在指向数组的指针上使用sizeof 获得真正的数组长度。

    恐怕你必须找到更好的方法(只需从调用函数发送SIZE)。

    另外,您需要在打印结果后调用free(temp)

    最后,不要使用new。它是 C++ 中的保留字,除了令人困惑之外,如果您将此代码移植到 C++,它将无法编译。

    【讨论】:

    • 这是个好主意,但除了指针运算和索引之外,还有其他方法可以访问那些非内存连续元素吗?
    • 很高兴知道它只会在 C 中运行,因为程序退出了为什么我应该释放内存(我的意思是它不是内存泄漏,如果它运行一次然后在 10 秒后退出,对吗?)
    • 没有。动态分配的内存(在运行时)不是程序所在内存的一部分(仅包括程序的代码段(函数)、程序的数据段(全局和静态变量)以及程序堆栈(非静态局部变量))。所以当你的程序退出时,这块内存不会被释放。
    • 尽管在本地范围内,我也应该免费(新),但我认为 temp 将间接免费(这个)
    • 不要释放函数linesum中变量new指向的地址。您在函数main 中使用了这个地址,应该只在之后释放它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多