【发布时间】:2016-11-16 17:13:37
【问题描述】:
我有一个二维数组,其中第一个维度的长度是可变的,但第二个维度是固定的。现在在函数调用中,我可以执行类似char foo[][3] 的操作,但struct 中的相应定义是什么?
所以在示例代码中,我希望它打印一行中的每个字符串,但正如预期的那样,它将存储的指针视为一维数组。
#include <stdlib.h>
#include <stdio.h>
struct payload_s {
size_t length;
char *text;
};
typedef struct payload_s payload;
static char some_text[4][3] = {"Ab", "Cd", "Ef", "Gh"};
payload* create_payload(char *text, size_t length)
{
payload *p = malloc(sizeof *p);
p->text = text;
p->length = length;
return p;
}
int main()
{
payload *p = create_payload(some_text, 4);
for (size_t i = 0; i < p->length; ++i)
printf("%zu: %s\n", i, &p->text[i]);
}
我主要是因为一个警告才注意到这一点的:
strut.c: In function ‘main’:
strut.c:23:33: warning: passing argument 1 of ‘create_payload’ from incompatible pointer type [-Wincompatible-pointer-types]
payload *p = create_payload(some_text, 4);
^~~~~~~~~
strut.c:13:10: note: expected ‘char *’ but argument is of type ‘char (*)[3]’
payload* create_payload(char *text, size_t length)
^~~~~~~~~~~~~~
当函数实际上被定义为payload* create_payload(char text[][3], size_t length) 时,我可以摆脱这个警告,但是几行之后有一个警告并且行为没有改变:
strut.c: In function ‘create_payload’:
strut.c:16:13: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
p->text = text;
^
是否只有手动将指针增加每个值的长度的解决方案?
【问题讨论】:
-
您有概念问题:您无法在 四个
char数组(此处为{"Ab\0", "Cd\0", "Ef\0", "Gh\0"};)下存储一个仅char-pointer(此处为char *text;),至少不是以理智的方式。编译器警告提示了这个问题。 -
这基本上就是我要问的:我还能如何将它们存储在结构中?
-
OT:
"Ab\0"在内部表示为{'A', 'b', '\0', '\0'},因此您可能不想明确放置'\0'。 -
将成员
char * text也更改为char (*)[3]:设为char (*text)[3]。 -
在调用任何堆内存分配函数时:(malloc, calloc, realloc),始终检查 (!=NULL) 返回值以确保操作成功
标签: c string pointers multidimensional-array struct