• C—结构体,动态分配内存存储字符串


    #define _CRT_SECURE_NO_WARNINGS
    #pragma warning(disable:4996)
    //上面这一行必须加,否则strcpy不能用
    
    #include
    #include
    
    typedef struct LNode {
    	char* name;
    	int age;
    }LNode,*LinkNode;
    
    
    int main() {
    	LNode node;
    	LinkNode lnode = (LinkNode)malloc(sizeof(LinkNode));
    	if (lnode == NULL) {								/* 检查内存分配是否成功 */
    		return -1;
    	}
    	lnode->age = 20;
    
    
    	char name1[] = "小时光";
    	node.name = (char*)malloc(strlen(name1)+1);				/* node.name 指向了一个具有足够内存空间的字符数组,可以用来存储字符串 name1。 */
    
    	if (node.name == NULL) {								/* 检查内存分配是否成功 */
    		return -1;
    	}
    	strcpy(node.name, name1);
    	printf("%s", node.name);
    
    	//防止内存泄漏,在适当的情况下,释放内存
    	free(node.name);		
    	free(lnode);
    	return 0;
    }
    
    /*上面的malloc(strlen(name1)+1)可以换成malloc(sizeof(name1))吗?
    
    不可以。在C语言中,sizeof(name1)将返回name1数组的大小(以字节为单位),而不是字符串的长度。
    在C语言中,字符串是以null终止的字符数组,所以字符串的长度通常比其分配的内存空间多1字节,用来存储null终止符\0。
    因此,使用malloc(strlen(name1) + 1)确保为字符串分配了足够的内存空间,包括字符串中的字符以及null终止符。如果你使用malloc(sizeof(name1)),可能会导致内存越界错误,因为没有为null终止符预留空间,这会导致字符串操作函数(例如strcpy)无法正常工作,从而产生不可预测的结果。所以,在动态分配内存空间给字符串时,一定要确保为null终止符留出足够的空间。*/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    动态分配内存空间给结构体成员变量通常在以下情况下使用:

    1. 字符串成员变量: 如果结构体中包含字符串,字符串的长度是不确定的,你可能需要使用动态内存分配来存储字符串,确保足够的空间来容纳字符串内容。

      struct Person {
          char* name;
          int age;
      };
      
      • 1
      • 2
      • 3
      • 4
    2. 可变大小的数组: 如果结构体包含数组,并且数组的大小是在运行时确定的,你可以使用动态内存分配来为数组分配足够的空间。

      struct Data {
          int* numbers;
          int size;
      };
      
      • 1
      • 2
      • 3
      • 4
    3. 动态创建结构体数组: 如果你需要在运行时确定结构体数组的大小,你可以使用动态内存分配来创建一个结构体数组。

      struct Point {
          int x;
          int y;
      };
      
      struct Point* pointsArray = (struct Point*)malloc(numPoints * sizeof(struct Point));
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    在这些情况下,动态分配内存空间是很有用的,因为它允许你在运行时根据需要分配内存,而不需要提前知道数据的大小。然而,使用动态内存分配需要谨慎,确保在适当的时候释放内存,以避免内存泄漏。如果在程序中频繁使用动态分配内存,建议在代码中加入必要的内存管理策略,以确保内存的正确分配和释放。

  • 相关阅读:
    C语言:对于宏的一些概念及技巧
    Django(4)表单
    k8s相关的概念
    CDH 02cloudera安装包配置&&JDK1.8(markdown新版)
    in git how to blame who delete this line code
    VScode+ArduinoCLI环境搭建
    java合成多个pdf为一个pdf
    Spring Boot 实现动态数据源配置
    做网赚的核心是:流量思维+变现思维
    磁盘怎么分区?3 款最佳免费磁盘分区软件
  • 原文地址:https://blog.csdn.net/weixin_45864704/article/details/134256889