【问题标题】:Really lost on how to fill allocated memory in C [closed]真的迷失了如何在 C 中填充分配的内存 [关闭]
【发布时间】:2020-08-11 08:02:15
【问题描述】:

所以对于我正在做的一个项目,我有两个文件。在第一个文件中,我有一个 typedef 结构,它是一个头文件。在第二个中,我使用 malloc() 分配了内存,然后我尝试使用我在第一个文件中使用“。”的结构填充分配的内存。运算符。

不知道怎么做...

文件 1 如下所示:

typedef struct
{
     /* members */
}THING;

文件 2 看起来像这样(不是主要的):

int *ptr;
ptr = malloc(sizeof(THING)); //allocates memory for THING

【问题讨论】:

  • 您是否能够打开文件? ptr = malloc(sizeof(FILE)); 似乎表明您在这样做时遇到了麻烦......除非您正在定义一个名为 FILE 的新 structure。你不应该因为它已经在stdio.h 中定义过(我认为)。
  • malloc 返回一个指针。您将无法使用点符号来访问 ptr 变量的成员。您必须改用箭头符号->
  • 正如摆弄位所指出的那样, FILE 已在 stdio.h 中定义。而且你不需要 malloc 来使用它。
  • 阅读more about C;顺便说一句,您的术语是错误的,您有两个 源文件 和技术上两个 translation units。你应该共享一个通用的#included 头文件。

标签: c pointers memory-management struct variable-assignment


【解决方案1】:
int *ptr;
ptr = malloc(sizeof(THING));

ptr 是一个指向int 的指针,但这不合适,因为您想指向结构THING

需要将指针定义为指向THING的指针 -> THING *ptr

然后我试图用我在第一个文件中使用“。”的结构填充分配的内存。运算符。

我理解你的真正意思(用值填充结构的成员,而不是用结构填充分配的内存),但这不能像上面所说的那样工作 ptr 不是一个合适的指针和. 不用于通过指向结构对象的指针访问元素。请改用->

旁注:

  1. 始终通过检查ptr 中的NULL 来证明内存分配是否成功。
  2. 我使用malloc(sizeof(*ptr));,因为它确保分配的大小适合ptr 指向的对象。

解决办法是这样的:

文件1.h:

typedef struct s1{
   int a;
   double b;
   char c;
} THING;

文件2.c

#include <stdlib.h>
#include <stdio.h>
#include "File1.h"     // Note File1.h must be in the same directory as File2.c

int main(void)
{
   THING *ptr = malloc(sizeof(*ptr));
   if(ptr == NULL)
   {
       fprintf(stderr,"Memory could not be allocated!");
       return 1;
   }

   ptr->a = 10;
   ptr->b = 25.4;
   ptr->c = 'A';

   printf("a = %d\n", ptr->a);
   printf("b = %.2f\n", ptr->b);
   printf("c = %c", ptr->c);

   return 0;   
}

输出:

a = 10
b = 25.40
c = A

【讨论】:

  • 是的,我只是将其命名为“THING”。这是一个示例,因此它的名称实际上不是 FILE。
  • @awb0000 这是你要求的还是别的什么?
【解决方案2】:

你有两个明显的问题。

首先,您声明 int *ptr 指向为 THING 分配的内存区域 - 而应该是 THING *ptr

当结构指针的语法为ptr-&gt;field 时,您第二次声称尝试使用ptr.field

例如:

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

typedef struct
{
     /* members */
     int thing1;
     float thing2;
}THING;

int main()
{
    THING *ptr;
    ptr = malloc(sizeof(THING)); //allocates memory for THING
    if(NULL == ptr) {
        return 1;
    } else {
        ptr->thing1 = 1;
        ptr->thing2 = 2;
        fprintf(stderr, "one: %d  and two: %f\n", ptr->thing1, ptr->thing2);
        return 0;
    }
}

生产:

% gcc so.c -o so && ./so
one: 1  and two: 2.000000

【讨论】:

    【解决方案3】:

    文件是字节流。如果要将数据存储在文件中,则需要确定作为字节流的文件格式,然后您需要编写代码以将数据从平台碰巧使用的任何本机格式转换为字节流格式您选择的文件。

    不要试图通过将原始结构写入文件来操纵它。这是一种复杂得多的方法,在掌握普通序列化方法之前不应尝试。

    强烈建议您尽可能详细地记录您的文件格式。您可以查看现有文件格式的文档,了解此类文档的典型外观。

    或者您可以只使用带有换行符或逗号的文本作为字段分隔符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 2021-11-27
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多