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

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
//上面这一行必须加,否则strcpy不能用

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

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

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

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

    struct Point {
        int x;
        int y;
    };
    
    struct Point* pointsArray = (struct Point*)malloc(numPoints * sizeof(struct Point));
    

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言结构体中,是可以使用动态字符串数组的。一种实现方法是使用指针和动态内存分配函数(如malloc、calloc等)来创建一个指向字符串的指针数组,然后在需要的时候动态地分配内存来存储字符串。下面是一个示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LEN 50 typedef struct { char **names; int num_names; } Person; void add_name(Person *p, char *name) { p->num_names++; p->names = realloc(p->names, sizeof(char *) * p->num_names); p->names[p->num_names - 1] = malloc(sizeof(char) * (strlen(name) + 1)); strcpy(p->names[p->num_names - 1], name); } int main() { Person p; p.names = NULL; p.num_names = 0; add_name(&p, "John"); add_name(&p, "Mary"); add_name(&p, "Tom"); for (int i = 0; i < p.num_names; i++) { printf("Name %d: %s\n", i + 1, p.names[i]); } for (int i = 0; i < p.num_names; i++) { free(p.names[i]); } free(p.names); return 0; } ``` 在上面的代码中,我们定义了一个名为Person的结构体,其中包含一个char类型的指针指向字符串数组,以及一个int类型的变量表示数组中字符串的数量。我们定义了一个add_name函数,用于向字符串数组中添加新的字符串。这个函数首先将num_names加1,然后使用realloc函数重新分配names指针数组的内存空间,以便能够存储更多的指向字符串的指针。接下来,它使用malloc函数为新字符串分配内存,并使用strcpy函数将字符串复制到新分配的内存中。在主函数中,我们使用add_name函数向Person结构体中添加了三个字符串,然后使用for循环打印出每个字符串。最后,我们使用for循环和free函数释放了动态分配的内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值