指向char *值的问题

时间:2011-06-26 14:10:39

标签: c++ memory pointers

这段代码有什么问题(正确打印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中运行此代码。

5 个答案:

答案 0 :(得分:5)

该代码中存在两个问题:

  1. auto之类的char * arr[2]数组不会自动使用new[]创建;当函数返回时,它的存储空间消失了。这是垃圾的来源。您应该malloc()new[]

    char **arr = malloc(2 * sizeof (*char));
    
  2. 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;
}

...不要忘记freemalloc

答案 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;
    }