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

char指针使用问题:如何从store_stuff函数取值并在main中打印?

解决你的C语言char指针传参问题

嘿,你的代码其实已经走在正确的路上了!咱们把逻辑掰碎了说,再聊聊两种常见的实现方式,还有需要注意的细节:

先搞懂你当前代码为什么能跑

你在main里定义的char *name是个指针变量,它本身存的是内存地址。当你把&name传给store_stuff的char **name参数时,相当于把这个指针自己的地址递了过去——这样函数就能直接修改main里那个name指针指向的位置,而不是修改指针指向的内容。

在store_stuff里,*name = "John";是把字符串字面量"John"的地址塞给了main里的name指针,所以回到main打印的时候,自然能输出这个字符串。不过这里有个小坑:字符串字面量存在程序的只读内存区,要是之后你想改它的内容(比如name[0] = 'j'),会直接触发未定义行为,大概率程序崩给你看。

优化版:规范的只读字符串实现

你的原代码可以正常运行,只是给指针加个初始化更规范,避免编译器警告:

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

void store_stuff(char **name, int *age);

int main(void) {
    char *name = NULL; // 先把指针初始化为NULL,更严谨
    int age;
    store_stuff(&name, &age); 
    printf("Name: %s\n", name);
    printf("Age: %d\n", age);
}

void store_stuff(char **name, int *age) {
    *name = "John"; // 赋值只读字符串字面量的地址
    *age = 31;
}

如果需要可修改的字符串:用动态内存分配

要是你之后需要修改名字的内容,就得用malloc分配一块可写的内存,再把字符串拷贝进去。记得用完要释放内存,不然会漏内存:

#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 要包含malloc和free的头文件

void store_stuff(char **name, int *age);

int main(void) {
    char *name = NULL;
    int age;
    store_stuff(&name, &age); 
    
    if (name != NULL) {
        printf("Name: %s\n", name);
        // 现在可以放心修改字符串内容了
        name[0] = 'j';
        printf("Modified name: %s\n", name);
        
        free(name); // 一定要释放动态分配的内存!
    }
    printf("Age: %d\n", age);
}

void store_stuff(char **name, int *age) {
    const char *temp_name = "John";
    // 分配足够存下整个字符串的内存(包括末尾的'\0')
    *name = malloc(strlen(temp_name) + 1);
    if (*name != NULL) {
        strcpy(*name, temp_name); // 把字符串拷贝到分配的内存里
    }
    *age = 31;
}

最后说下你疑惑的调用语句

你在main里写的store_stuff(&name, &age);完全正确!因为:

  • name是char*类型,它的地址就是char**类型,正好匹配函数的第一个参数
  • age是int类型,它的地址是int*类型,匹配第二个参数

只有这样传参,函数才能修改main里的指针指向,以及age的值。

内容的提问来源于stack exchange,提问作者Zoey Malkov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:02:11