这段代码有什么问题(正确打印arr [0]但是我遇到arr [1]的问题...打印一些奇怪的字符):
using namespace std;
char ** setName() {
char * arr[2];
for (int i=0;i<2;i++)
arr[i] = (char*)malloc(100);
arr[0] = strdup("Robert");
arr[1] = strdup("Jose");
return arr;
}
int main()
{
char **arr;
arr = setName();
printf("First name is %s\n", arr[0]);
printf("Second name is %s\n", arr[1]);
return 0;
}
如果重要,我使用Visual Studio 8在Windows中运行此代码。
答案 0 :(得分:5)
该代码中存在两个问题:
auto
之类的char * arr[2]
数组不会自动使用new[]
创建;当函数返回时,它的存储空间消失了。这是垃圾的来源。您应该malloc()
或new[]
。
char **arr = malloc(2 * sizeof (*char));
strdup()
执行malloc()
,因此您无意中malloc()
存储因为覆盖指针而丢失。
答案 1 :(得分:4)
您正在返回本地变量的地址。 arr
退出后setName
不存在,因此main
的{{1}}指向内存不良。
通过将其作为参数传递给arr
,您最好直接写入main
的{{1}}:
arr
答案 2 :(得分:2)
你的指针数组是你的setName函数的本地。
尝试类似:
char ** setName() {
char ** arr = (char **)malloc(2 * sizeof(char *));
for (int i=0;i<2;i++)
arr[i] = (char*)malloc(100);
strcpy(arr[0], "Robert");
strcpy(arr[1], "Jose");
return arr;
}
...不要忘记free
你malloc
。
答案 3 :(得分:0)
您将返回arr的地址。这是未定义的行为,你真的不知道会发生什么。我强烈建议您通过引用向该函数添加一个参数,然后从main传递arr而不是返回。
答案 4 :(得分:0)
您的代码可能是这样的:
char *setName() {
char * arr[2];
static int j=0;
int i=0;
for (i=0;i<2;i++)
arr[i] = (char*)malloc(100);
strcpy(arr[0],"Robert");
strcpy(arr[1],"Jose");
return arr[j++];
}
int main(){
char *arr1,*arr2;
arr1 = setName();
arr2 = setName();
printf("First name is %s\n", arr1);
printf("First name is %s\n", arr2);
return 0;
}