You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:15:29