【发布时间】:2023-01-11 01:14:50
【问题描述】:
这是我期望我的字符串数组在程序运行后的样子:{"#0", "#1", "2"}。
这就是我得到的:{"#2", "#2", "2"}。
如何修改这段代码,以便在函数执行后可以在 main 中获取 {"#0", "#1", "#2"}?
我究竟做错了什么?请帮忙。
#include <stdio.h>
void func(char **s){
for(int i=0; i<3; i++){
char buf[10];
snprintf(buf, 10, "#%d",i);
s[i]=buf;
}
}
int main()
{
char *s[3];
func(s);
for(int i=0; i<3; i++){
printf("%s", s[i]);
}
return 0;
}
【问题讨论】:
-
请学习使用纯 C++ 编码,而不是
C中的类似代码。您的代码具有未定义的行为,因为它返回一个指向局部变量的指针,该变量的生命周期结束。 -
你的错误是
s[i]=buf;请记住 buf 是 for 循环内范围的局部变量。一旦你点击}buf 变量并且它的内容不再存在但是你正在复制指针而不是指针指向的内容所以你将指针保存到不存在的对象。 -
有几种不同的方法可以做到这一点,如果不进一步了解您的家庭作业或课堂作业,就不可能告诉您确切的方法。显然,您应该以特定方式执行此操作,无论是通过动态分配、预分配缓冲区还是其他方式。您的 C++ 教科书或布置此练习题的 C++ 课程的章节主题是什么?不用说,如果您没有以预期的方式执行此操作,您将不会因您的解决方案而受到赞誉。
-
那么你正在学习
C而不是C++。手动内存管理应该是一个高级主题,需要有理由才能使用。 -
@Unyaya
{ char buf[10]; ... }- 在}你松了buf。它已经不复存在了。您在buf上指向的任何内容现在都是一个“悬挂”指针,并从那些悬挂指针指向的内存中读取未定义的行为.
标签: c double-pointer char-pointer