如何初始化char指针数组,避免出现垃圾值?

How to initialize char pointer array, to avoid garbage values?

我遇到一个问题,我尝试初始化的一些全局字符指针数组在我初始化它们的函数超出范围后变得充满垃圾数据。

char *dept_vals[255];
char *num_vals[255];
char *day_vals[255];
char *bldg_vals[255];
char *instr_vals[255];
int start_vals[255];
int end_vals[255];
int sect_vals[255];
int room_vals[255];

int idx;

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i = 0;
    while(i < argc)
    {
        dept_vals[idx] = argv[i++];
        num_vals[idx] = argv[i++];
        start_vals[idx] = atoi(argv[i++]);
        end_vals[idx] = atoi(argv[i++]);
        day_vals[idx] = argv[i++];
        sect_vals[idx] = atoi(argv[i++]);
        bldg_vals[idx] = argv[i++];
        room_vals[idx] = atoi(argv[i++]);
        instr_vals[idx] = argv[i++];

        idx++;

    }
    return 0;
}

当我在不同的函数中打印值时,内容不正确。但是,我在同一函数中初始化的整数数组中的值具有正确的值。我怀疑我初始化 char 指针数组的方式导致了意外行为,但我不完全确定在这种情况下初始化它们的正确方法是什么。

不知道你是怎么调用这个函数的,它只是猜测。

如果你使用 gcc 尝试替换:

... = argv[i++];

... = argv[i] ?strdup(argv[i]) :NULL; ++i;

并使用选项 -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED.

进行编译

strdup() 重复传递的 "string"。

代码类似

dept_vals[idx] = argv[i++];

将 argv[i] 的 地址 复制到 dept_vals[idx] 中,但是正如您指出的那样,当您 return.您要复制实际的字符串:

dept_vals[idx] = malloc(strlen(argv[i]) + 1);
strcpy(dept_vals[idx], argv[i]);
++i;