所以我的代码在 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/