C语言结构体中字符数组赋值失败问题求助
问题分析与修复
你定义的person结构体、createPerson和setName函数存在几个指针与字符串处理的错误,导致name字段赋值后出现垃圾值,具体问题和修复方法如下:
错误点1:setName传参类型不匹配
主函数中setName(&person, string);这行代码有误:person本身就是void*类型的结构体指针,你传递&person相当于传了一个void**(指针的指针),而setName接收的是void*参数,类型不匹配会导致后续强制转换后访问错误的内存地址,根本没修改到目标结构体的name字段。
修复:直接传递结构体指针:
setName(person, string);
错误点2:字符串未添加终止符
setName里用循环逐个复制字符,但没有给person_pt->name添加字符串终止符'\0'。C语言中字符串必须以'\0'结尾,否则printf或strlen这类函数会一直读取内存直到找到随机的'\0',表现为输出垃圾值。
修复:用strncpy安全复制并手动添加终止符(避免数组溢出):
strncpy(person_pt->name, name, sizeof(person_pt->name) - 1); person_pt->name[sizeof(person_pt->name) - 1] = '\0';
错误点3:printf参数类型错误
setName里的printf("str: %s ", person_pt->name[i]);有误:%s需要字符串指针,而person_pt->name[i]是单个字符(char类型),类型不匹配会导致输出异常;且循环结束后i的值等于strlen(name),已经超出有效字符的下标范围。
修复:直接传递字符串数组名(会隐式转为指针):
printf("str: %s\n", person_pt->name);
额外优化:初始化malloc内存
createPerson里malloc的内存未初始化,会包含随机垃圾值,建议用calloc直接初始化为0:
void* createPerson() { void* newPerson = calloc(1, sizeof(struct person)); return newPerson; }
修正后的完整代码
主函数修改后:
#define STRING_LEN 100 int main() { void* person = createPerson(); int testNumber = 1; int number = 42; int result=0; int number2=0; char *string = (char *)malloc(sizeof(char) * STRING_LEN); strncpy(string, "Marco", STRING_LEN); setName(person, string); // 释放内存避免泄漏 free(string); free(person); return 0; }
.c文件修改后:
#include "function.h" #include <string.h> #include <stdio.h> #include <stdlib.h> void* createPerson() { void* newPerson = calloc(1, sizeof(struct person)); return newPerson; } void setName(void* person, char *name) { t_person* person_pt = (t_person*)person; strncpy(person_pt->name, name, sizeof(person_pt->name) - 1); person_pt->name[sizeof(person_pt->name) - 1] = '\0'; printf("str: %s\n", person_pt->name); }
内容的提问来源于stack exchange,提问作者giu seppe
相关产品推荐
相关产品推荐

