C语言无法将字符串复制到指针,出现段错误寻求帮助
你的C语言指针问题分析与修正方案
代码里的核心错误点
- 函数名非法:原函数
pointer copy包含空格,C语言函数名不允许有空格,且你在main里调用的是copy,函数名需改为合法标识符。 - 字符串初始化错误:
char x='password';单引号仅用于单个字符,字符串必须用双引号;且单个char变量存不下整个字符串,需用字符数组或字符串指针。 - 二级指针赋值错误:你想通过二级指针修改主函数的指针,但直接给
result赋值只会修改形参本身,无法影响实参。正确做法是给*result赋值,因为result指向主函数中encrypted_message的地址,*result就是encrypted_message本身。 - 局部变量内存失效:如果用局部字符数组存储字符串,函数执行结束后该内存会被释放,后续访问会触发段错误。必须用动态分配内存来保留数据。
- 语法细节错误:
printf中的换行符应为\n,free(encrypted_message)缺少分号。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int copy(char **result) { const char *source_str = "password"; // 动态分配内存,+1是为了存储字符串结束符'\0' *result = (char *)malloc(strlen(source_str) + 1); if (*result == NULL) { // 内存分配失败返回错误码 return -1; } // 复制字符串到分配的内存 strcpy(*result, source_str); return 0; } int main(void) { char *encrypted_message = NULL; if (copy(&encrypted_message) == 0) { if (encrypted_message != NULL) { printf("%s\n", encrypted_message); } // 释放动态分配的内存,避免泄漏 free(encrypted_message); encrypted_message = NULL; // 标记为NULL,防止野指针 } return 0; }
关键修正说明
- 用
malloc动态分配内存,确保字符串在函数结束后依然有效,不会被系统回收。 - 用
strlen获取字符串长度,加1是因为C语言字符串必须以'\0'作为结束标志,否则printf等函数会读取到垃圾数据。 - 检查
malloc的返回值,避免内存分配失败导致的后续错误。 - 正确使用二级指针
*result赋值,让主函数的encrypted_message指向有效内存。 - 释放内存后将指针置为
NULL,避免后续误操作野指针。
内容的提问来源于stack exchange,提问作者idkDude
相关产品推荐
相关产品推荐

