Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构的动态内存分配_C_Dynamic Memory Allocation - Fatal编程技术网

C 结构的动态内存分配

C 结构的动态内存分配,c,dynamic-memory-allocation,C,Dynamic Memory Allocation,我需要写一个程序,其中包含两个字段:整数和字符串。接下来,我需要编写一个函数来动态分配这个结构,并将int和string作为参数传递给分配的结构。此函数还将返回指向新构造的指针。这个程序的第二个元素应该是函数,它以struct指针为参数,然后在屏幕上打印所有文件,然后释放struct的内存。这是我能想到的最好的了 #include <stdio.h> #include <stdlib.h> struct str{ int num; char text[20]

我需要写一个程序,其中包含两个字段:整数和字符串。接下来,我需要编写一个函数来动态分配这个结构,并将int和string作为参数传递给分配的结构。此函数还将返回指向新构造的指针。这个程序的第二个元素应该是函数,它以struct指针为参数,然后在屏幕上打印所有文件,然后释放struct的内存。这是我能想到的最好的了

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

struct str{
   int num;
   char text[20];
};

struct str* return_address(int *num, char *text){
  struct str* new_struct=malloc(sizeof(struct str));
  new_struct->num=num;
  new_struct->text[20]=text;
  return new_struct;
};

void release(struct str* s_pointer){
  printf("%d %s", s_pointer->num, s_pointer->text);
  free(s_pointer);
};



int main()
{
  struct str* variable=return_address(1234, "sample text");
  release(variable);

  return 0;
}
#包括
#包括
结构str{
int-num;
字符文本[20];
};
结构str*返回地址(int*num,char*text){
struct str*new_struct=malloc(sizeof(struct str));
新建结构->num=num;
新建结构->文本[20]=文本;
返回新结构;
};
无效释放(结构str*s_指针){
printf(“%d%s”,s\u指针->数值,s\u指针->文本);
自由(s_指针);
};
int main()
{
struct str*变量=返回地址(1234,“示例文本”);
释放(变量);
返回0;
}
  • 您的阵列非常小,而且它根本不是动态的。如果您使用
    malloc()
    进行分配,为什么不动态分配所有内容
  • 您不能分配给数组
  • num
    成员(我想它是用来存储“字符串”的长度)被分配了一个指针,这显然不是您想要的。而且,该行为仅在非常特殊的情况下定义,当您将指针指定给整数时,编译器应该向您发出警告,除非您关闭了警告
  • 也许你想要这个

    struct string {
        char *data;
        int length;
    };
    
    struct string *
    allocate_string(int length, const char *const source)
    {
        struct string *string;
        string = malloc(sizeof *string);
        if (string == NULL)
            return NULL;
        string->length = strlen(source);
        // Make an internal copy of the original
        // input string
        string->data = malloc(string->length + 1);
        if (string->data == NULL) {
            free(string);
            return NULL;
        }
        // Finally copy the data
        memcpy(string->data, source, string->length + 1);
        return string;
    }
    
    void
    free_string(struct string *string)
    {
        if (string == NULL)
            return;
        free(string->data);
        free(string);
    }
    

    问题是什么?我不能让这个程序工作。即使编译后它崩溃了。我猜,
    new\u struct->text[20]=text不是你想要的几个问题。这里有两个。在return_address函数中,需要的是'int num',而不是'int*num'。另外,请看一行代码:“new_struct->text[20]=text;”。应该是strncpy(new_struct.text,text,sizeof(new_struct.text));您可能需要将new_struct->text的最后一个字节设置为“\0”,以确保它以null结尾,否则,如果原始字符串为20个字符或更多,printf可能会爆炸。警告不是为了好玩。启用并注意它们!只有在你把它们修好后才可以问!(如果您不了解现有问答,请搜索它们)。并始终检查
    malloc
    和其他可能报告严重错误的函数的结果。