我有一些这样的代码:
int main(){
char *a = "2d6c002d61";
char *b[strlen(a)];
char *p;
int count = 0;
p = strtok(a,"00");
while(p){
unsigned char *c;
char tar[100];
hex_to_ascii(p,c);
strncpy(tar,c,2);
tar[2] = '\0';
b[count]=tar;
count++;
p = strtok(NULL,"00");
}
b[count] = NULL;
return 0;
}
hex_to_ascii()会将十六进制字符串转换为ascii字符串,例如,“ 2d6c”将转换为“ -l”。我已经检查了此功能,并确保它可以正常工作。
我希望将a
分为"2d6c"
和"2d61"
,然后使用hex_to_ascii()进行转换,并使b = {“ -l”,“-a”}。
问题是,尽管起初我得到-l
并制作了b = {"-l"}
,但后来变成了{"-a","-a"}
。
答案 0 :(得分:0)
您不能在循环中创建多个阵列。
对于您想做的事情,应该使用malloc
而不是数组。完成操作后,别忘了free
。
借助malloc
,您可以免费使用一些内存,并且只有在释放后该内存才无效。
您的代码中发生的是:
您在循环中创建tar
,而在while循环的一次迭代结束时到达}
时,整个数组将无效。这意味着在循环的每次迭代中,您都将创建一个新的数组(甚至可能与以前相同)。旧的无效,但是您将数组的起始地址保存在b
中,不允许读取该地址,从而使其无效。(尝试时会产生未定义的行为)。
如果需要特定的地址,可以使用&tar[x]
。如果使用&tar[0]
,则可以更清楚地看到正在处理数组。并且每次循环迭代都需要一个单独的字符串。
关于您评论中的问题。
"hello"
是字符串文字,表示它是不可变的,并且表达式返回一个地址/指针。可以将该地址分配给指针变量。该字符串具有静态存储期限(在程序终止之前有效)。但是,如果您分配tar
具有自动存储时间,则基本上意味着它仅在到达当前所在块的}
时才有效。
有关如何在c中使用malloc的有趣文章: Do I cast the result of malloc?