c - 尝试根据 C 中的增量分配 char[] 的值

标签 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"}之后。

最佳答案

您不能在循环中创建多个数组。

对于你想做的事情,你应该使用 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/

相关文章:

c - 如何分析代码段?

c - 访问冲突读取位置 0xfdfdfdfd。 IN C

c - 底数大于10的C扫描

string - 在 Golang 中达到定义的最大长度之前,如何将跟随者字符连接到字符串?

java - 回文识别器

c# - 循环读取char

c++ - 打包和指针别名,C 和 C++

c - C中的局部变量地址

c - 用 C 实现 Malloc

c++ - 安全地将字节写入流