浅草夏洛洛 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 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办