尝试根据C

时间:2018-09-24 08:05:25

标签: c char

我有一些这样的代码:

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"}

1 个答案:

答案 0 :(得分:0)

您不能在循环中创建多个阵列。

对于您想做的事情,应该使用malloc而不是数组。完成操作后,别忘了free

借助malloc,您可以免费使用一些内存,并且只有在释放后该内存才无效。

您的代码中发生的是:

您在循环中创建tar,而在while循环的一次迭代结束时到达}时,整个数组将无效。这意味着在循环的每次迭代中,您都将创建一个新的数组(甚至可能与以前相同)。旧的无效,但是您将数组的起始地址保存在b中,不允许读取该地址,从而使其无效。(尝试时会产生未定义的行为)。

如果需要特定的地址,可以使用&tar[x]。如果使用&tar[0],则可以更清楚地看到正在处理数组。并且每次循环迭代都需要一个单独的字符串。

关于您评论中的问题。

"hello"是字符串文字,表示它是不可变的,并且表达式返回一个地址/指针。可以将该地址分配给指针变量。该字符串具有静态存储期限(在程序终止之前有效)。但是,如果您分配tar具有自动存储时间,则基本上意味着它仅在到达当前所在块的}时才有效。

有关如何在c中使用malloc的有趣文章: Do I cast the result of malloc?