我有一些这样的代码:
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"}
之后。
最佳答案
您不能在循环中创建多个数组。
对于你想做的事情,你应该使用 malloc
而不是数组。别忘了free
完成后。
使用malloc
,您可以获得一些内存供您免费使用,并且只有在释放时它才会变得无效。
您的代码中发生的情况是:
您在循环中创建了 tar
,当您在 while 循环的一次迭代结束时到达 }
时,整个数组就会变得无效。这意味着在循环的每次迭代中,您都会创建一个新数组(甚至可能在与之前相同的位置)。旧的无效,但您将数组开头的地址保存在 b
中,不允许您从该地址读取,使其无用。(并在尝试时创建未定义的行为)。
如果您想要数组部分的特定地址,可以使用&tar[x]
。如果您使用 &tar[0]
,则可以更清楚地看出您正在处理数组。并且循环的每次迭代都需要一个单独的字符串。
关于您评论中的问题。
"hello"
是一个字符串文字,这意味着它是不可变的,并且表达式返回一个地址/指针。该地址可以分配给指针变量。该字符串具有静态存储持续时间(在程序终止之前一直有效)。但是,如果您指定 tar
,它就会自动存储持续时间,这基本上意味着它仅在您到达当前所在 block 的 }
之前有效。
关于如何在 c 中使用 malloc 的有趣阅读: Do I cast the result of malloc?
关于c - 尝试根据 C 中的增量分配 char[] 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52475018/