我想创建一个字符串数组,所以我首先使用:
char** p = malloc(sizeof(char*) * count); // count is the number of strings
但是当我想要初始化这些字符串时,麻烦来了:
for (int i = 0; i < count; i++)
{
char* s = malloc(size_of_each_string);
*p + i = s; // THIS STEP INDUCES ERROR
while (*s++ = *input++); // initialize by copy
}
所以我真的很困惑。 * p + i似乎是指针算术,它转移到另一个指针。一般允许指针赋值(指向同一个对象)。那么为什么不允许这样的任务呢?我怎么能绕过这个来完成这个任务呢?
错误消息是:表达式不可分配。
答案 0 :(得分:9)
使用*(p+i)=s
代替*p+i=s
。
您尝试做的事情是将{s}保留在(p+i)
地址中。为此,您需要使用*(p+i)
代替*p+i
。
关于错误讯息:
这里算术表达式* p + i将导出一个值。但是您只能将值保存到内存地址中。为此,您将收到该错误消息。
答案 1 :(得分:4)
*p + i = s;
相当于
*(p) + i = s;
由于operator precedence.它产生一个rvalue,这是不可分配的。
改为使用parantheses:
*(p + i) = s;
或者,更好的是,下载:
p[i] = s;
答案 2 :(得分:2)
这是operator precedence的问题。
表达式*p + i
被解析为(*p) + i
而不是*(p + i)
,因此您需要明确地将其解析。或者使用普通数组索引语法p[i]
。
答案 3 :(得分:2)
为什么不通过以下方式简化代码:
char** p = malloc(sizeof(char*) * count); // count is the number of strings
for (int i = 0; i < count; i++)
{
p[i] = malloc(sizeof(char) * size_of_each_string));
strcpy(p[i], input);
}