浅草夏洛洛 2019-05-22 21:36 采纳率: 100%
浏览 324
已采纳

c语言结构体中,一个非常奇怪的现象。求解答

运行环境 codeblock
运行过程中,输入0-10或者为负数的时候,子函数与主函数输出没有问题,然后输入11及其以上的数字,子函数正确,主函数输出为-1.
最开始我以为是内存空间溢出的问题,把MAX改小后依然存在问题。
然后我把结构体定义int n提到前面,输出就没有问题了。
下面是代码:

#include <stdio.h>
#define MAX 10
typedef struct HashNode *HashTable;
struct HashNode
{
    char data[MAX][MAX];
    int t[MAX];
    int n;
};
HashTable CreatTable(int Size);  //创建一个散列表, data为-1代表没有元素

int main(void)
{
    HashTable h;
    int x;
    scanf("%d",&x);
    h = CreatTable(x);
    printf("out n is %d\n",h->n);
}
HashTable CreatTable(int Size)  //创建一个散列表, data为-1代表没有元素
{
    HashTable h;
    int i;
    h = (HashTable)malloc(sizeof(struct HashNode));
    if(h == NULL)
    {
        printf("malloc error\n");
        exit(-1);
    }
    h->n = Size;
    printf("in n is %d\n",h->n);
    for(i = 0; i < Size; i++)
        h->t[i] = -1;
    return h;
}


错误运行案列:
图片说明

int n提前后

#include <stdio.h>
#define MAX 10
typedef struct HashNode *HashTable;
struct HashNode
{
    int n;
    char data[MAX][MAX];
    int t[MAX];
};
HashTable CreatTable(int Size);  //创建一个散列表, data为-1代表没有元素


运行如下
图片说明

求解答,感激不尽。

  • 写回答

1条回答 默认 最新

  • SoporAeternus2022 2019-05-22 23:37
    关注

    我看了一下程序,在vs2017上测试了一下
    先分析问题出现的位置,子函数for循环的位置
    int t[10]数组大小是10 所以输入小于十的数字没有问题
    当输入十一时,for循环输入十一个数字,造成数组越界,将-1写道int n中
    改变位置后,越界部分没有写入 int n中,所以显示是正确的

    for(i = 0; i < Size; i++)
    h->t[i] = -1;
    size是11, t[10]越界,
    malloc 要和free成对使用
    (希望对你有所帮助)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败