首页 > 解决方案 > C 中的结构实际上如何与 malloc 一起工作

问题描述

我正在尝试创建一个包含结构的程序,例如“myStruct”,其中包含字符串数组“char* 数组”。然后是一个分配内存然后打印输出的函数,然后是一个如下所示的 main 函数:

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

typedef struct myStruct { char *array; } str1;

void display(str1 *p1) {
  char *array;
  array = (char *)malloc(10 * sizeof(char));
  printf("%s", p1->array);
  free(array);
}

int main(void) {
  str1 s1;
  strcpy(s1.array, "Damn");
  return 0;
}

但是我希望“该死”作为输出,但我没有得到任何输出。但是在编译期间,显示以下警告:

user@localhost: ~ $ clang struct.c -Weverything
struct.c:7:6: warning: no previous prototype for function 'display' [-Wmissing-prototypes]
void display(str1 *p1) {
     ^
1 warning generated.

这意味着函数没有被调用。在这种情况下,我需要一些语法和语义上的帮助。我不确定如何调用函数 display()。

标签: cc99

解决方案


你没有打电话displaymain()要分配内存char *array并复制字符串,您可以设计如下函数:

#define DEFAULT_LEN 10
void allocate(str1 *p1, const char * str) {
    char * array;
    if(str) {
        //(char *) is omittable in C (not C++)
        array = malloc(strlen(str) + 1);
        strcpy(array, str);
    }
    else {
        array = malloc(DEFAULT_LEN);
        array[0] = 0;
    }
    p1->array = array;
}

你可以像这样打印文本:

int main() {
    str1 s1; allocate(&s1, "Damn");
    puts(s1.array);
    deallocate(&s1);
    return 0;
}

你必须释放内存:

void deallocate(str1 *p1) {
    free(p1->array);
    p1->array = NULL;
}

推荐阅读