C 如何初始化字符指针数组,以避免垃圾值?
我遇到了一个问题,我试图初始化的一些全局字符指针数组在我初始化它们的函数超出范围后充满了垃圾数据C 如何初始化字符指针数组,以避免垃圾值?,c,arrays,pointers,garbage,C,Arrays,Pointers,Garbage,我遇到了一个问题,我试图初始化的一些全局字符指针数组在我初始化它们的函数超出范围后充满了垃圾数据 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; s
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*dept\u vals[255];
字符*数值[255];
字符*日[255];
char*bldg_vals[255];
字符*instr_vals[255];
整数起始值[255];
int end_vals[255];
int sect_vals[255];
国际会议室[255];
int-idx;
静态int回调(void*NotUsed,int argc,char**argv,char**azColName)
{
int i=0;
而(i
当我在不同的函数中打印值时,内容不正确。但是,我在同一函数中初始化的整数数组中的值具有正确的值。我怀疑我初始化字符指针数组的方式导致了意外的行为,但我不完全确定在这种情况下初始化它们的正确方式是什么 在不知道如何调用函数的情况下,它只是猜测 如果使用gcc,请尝试替换:
... = argv[i++];
与
并使用选项-D\u XOPEN\u SOURCE-D\u XOPEN\u SOURCE\u EXTENDED
进行编译
复制正在传递的“字符串”。代码如下
dept_vals[idx] = argv[i++];
将argv[i]的地址复制到dept_vals[idx]中,但正如您所指出的,当您返回时,这超出了范围。要复制实际字符串:
dept_vals[idx] = malloc(strlen(argv[i]) + 1);
strcpy(dept_vals[idx], argv[i]);
++i;
您将此条件设置为
i
,但在循环中不再检查它,尽管您将i
增加了9倍,您是否检查了argc%9==0
?您是否包括stdlib.h
昨天我看到了一个案例,这就是问题所在。我理解您的意思是整数值正确,但char*
结果不正确。向我们显示打印char*
结果的方式。“=”仅复制指针。如果您想要实际的字符串,您必须使用malloc()为它们分配空间,并将它们放入strcpy()中。是的,我进行了检查,argc%9==0。实际上我忘了显式地包含stdlib.h,但我认为它一定包含在我的另一个头文件中,因为atoi工作正常。明确地包括它并没有改变任何事情。
dept_vals[idx] = malloc(strlen(argv[i]) + 1);
strcpy(dept_vals[idx], argv[i]);
++i;