c - 在 C89 中,我似乎无法从现有的字符数组中创建字符数组

标签 c c89

所以我的代码在 buffer[i] = envp[i] 处崩溃。

我想创建一个环境变量的 char** 缓冲区,并将它们设置为小写(尚未添加 putc(tolower()) 循环)。但是当我尝试使 buffer[i] = envp[i] 时,编译器返回此错误:

error: assignment makes integer from pointer without a cast [-Wint-conversion] buffer[i] = envp[i]; ^

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=] printf("%s\n", buffer[i]); ~^ ~~~~~~~~~ %d

int main(int argc, char *argv[], char * envp[])
{
    int i = 0;

    char *buffer = NULL;

    while(envp[i])
    {
        i++;
    }

    buffer = (char *)malloc(i * 8);


    for (i = 0; envp[i] != 0 ; i++)
    {
        buffer[i] = envp[i];
        printf("%s\n", envp[i]);
        printf("%s\n", buffer[i]);
    }

    return 0;

}

请帮忙,我在这里一直很头疼:(。非常感谢!!!

最佳答案

buffer 不是保存字符串数组的正确类型。它应该定义为:

char **buffer;

此外,您应该按如下方式malloc:

buffer = malloc(i * sizeof(*buffer));

显式使用 sizeof(*buffer) 而不是魔数(Magic Number) 8,因为指针不能保证为 8 个字节。这也优于 sizeof(char *),因为它不依赖于 buffer 的类型 另外,don't cast the return value of malloc .

由于 env 由 NULL 指针终止,因此您需要对 buffer 执行相同的操作。您还应该使用 strdup 复制字符串,而不仅仅是复制指针,这样您就可以处理单独的副本:

char **buffer = malloc((i+1) * sizeof(*buffer));

for (i = 0; envp[i] != 0 ; i++)
{
    buffer[i] = strdup(envp[i]);
    printf("%s\n", envp[i]);
    printf("%s\n", buffer[i]);
}
buffer[i] = NULL;

关于c - 在 C89 中,我似乎无法从现有的字符数组中创建字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52821836/

相关文章:

将字符串中的值转换为 float 组

c - 变量类型结构体是否必须是数组才能存储 100 个元素?

c - C语言中的积分提升和平衡有什么区别?

c - 是否否定 INT_MIN 未定义的行为?

c - 下面的C代码实现了什么

c - WinAPI 文档自相矛盾?

c - 如何对大数求和?

C18 sprintf() 给出语法错误

c - 有人为 MSP430 的 IAR Embedded Workbench 实现了 __getzone() 吗?

c - 在 C89 中是否有任何成熟/标准化的方法来使用固定宽度整数?