【问题标题】:Printing decimal value instead of pointers打印十进制值而不是指针
【发布时间】:2017-11-10 10:20:40
【问题描述】:

我正在使用 realloc 将一些数据分配到内存中

打印字符数组/字符值没有问题,但只有十进制我遇到问题

size_t N_att;
typedef struct student_struct {          
    char *name;
    int32_t     age; 
    int32_t     marks;  

} STUDENT;
STUDENT*STUDENTS;


STUDENTS= realloc(STUDENTS, (N_att + 3) * sizeof(*STUDENTS));
STUDENTS[N_att].name = "James";
STUDENTS[N_att++].age = 20;
STUDENTS[N_att+2].marks = 100;
STUDENTS[N_att] = (STUDENT) { NULL };

//testing to print the 1st entry only
printf("%s %d %d", STUDENTS[0].name, STUDENTS[0].age, STUDENTS[0].marks);

输出

James -8421540451 -8421540451

我不知道这里有什么问题,它正在打印对我来说看起来像内存中值的指针。 如果我打印小数的方向错误,请纠正我

【问题讨论】:

  • 在 realloc 中使用temp..否则如果失败..你有内存泄漏
  • 旁注:按照惯例,所有大写标识符都是为宏保留的。
  • 错字,已更正 N_att + 2
  • STUDENTS[N_att++] 也很可疑。 minimal reproducible example请。
  • FWIW,您使用索引 N_att、N_att++(增加 N_att)和 N_att+2(原始 N_att+3)。为什么?为什么不都访问同一个结构?

标签: c printf dynamic-memory-allocation realloc


【解决方案1】:

你没有给出一个最小的可编译示例,所以很难说你在那些不可见的代码部分做错了什么。

我的猜测是你没有初始化 N_att 变量,因此 realloc() 的未定义结果。

此外,在分配 "James"20100 时,您使用三个不同的表达式来计算 STUDENTS 数组的索引,这看起来很奇怪……这三个分配看起来像初始化一个 结构;如果是这样,这三个都应该使用相同的索引。

【讨论】:

  • 请不要将猜测作为答案。当/如果问题得到澄清时,它们可能会失效。而是关闭问题,并在问题得到改进并重新打开时回答。
  • 不仅N_atthas有问题。如果在函数中定义了 N_att 和 STUDENTS,则两者都未初始化,将“随机”指针提供给 realloc
  • @Gerhardh 这正是我写的:'我猜你没有初始化N_att变量'...
  • 是的,但你没有提到STUDENTS有同样的问题。
  • @Gerhardh 这里有很多问题,一一列举也没有用。然而,最重要的不是N_att 也不是STUDENTS,而是缺少MCVE。
【解决方案2】:

因为您正在将值初始化为不同的索引并使用 0 索引进行打印。正如 CiaPan 在他的评论中提到的那样,您的代码确实看起来很奇怪。如果您要打印 0 索引的值,那么您应该使用相同的索引。

#include <stdio.h>
#include <stdlib.h>

size_t N_att;
typedef struct student_struct
{
        char *name;
        int     age;
        int     marks;

} STUDENT;
STUDENT*STUDENTS;

int main()
{
        STUDENTS = realloc(STUDENTS, (N_att + 3) * sizeof(*STUDENTS));
        STUDENTS[N_att].name = "James"; // here you initialized in 0th index
        STUDENTS[N_att++].age = 20; // same here but N_att incremented by one
        STUDENTS[N_att+2].marks = 100; // here index is (updated index + 2 = 3)
        STUDENTS[N_att] = (STUDENT) { NULL }; // here you init it to null

        // Here you are printing 0 th index which has only "James" "20" 
        printf("%s %d %d\n", STUDENTS[0].name, STUDENTS[0].age, STUDENTS[0].marks);
}

注意:-再检查一遍,输出应该是“James”“20”“垃圾值”

【讨论】:

  • 请在发布前检查启用警告的代码。 (为你修好了。;-))
猜你喜欢
  • 2013-03-31
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多