我有一个10个字符串的数组,最多20个,我正在构建
res
但是之前的警告
失败了char buffer[10][20] = {0};
//populate the buffer with 10 strings
//after this point, no more changes to the buffer allowed
//make a new pointer to indicate that I want the buffer finalized
const char **finalized = buffer;
使用单个字符串执行类似操作
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
在第一种情况下投射的正确方法是什么?
答案 0 :(得分:4)
将常规2D数组“转换”为指向指针类型是不可能的。这些类型完全不兼容,并且具有完全不同的语义。你可以强迫演员,但结果无论如何都会毫无用处。
正式地,在这种情况下,正确的指针类型是char (*)[20]
char (*finalized)[20] = buffer;
除了C语言的const-correctness规则不允许你在那里添加const
。你可以强迫它
const char (*finalized)[20] = (const char (*)[20]) buffer;
您也可以
char (*finalized)[10][20] = &buffer;
这对你有用吗 - 我不知道,因为你没有提供任何关于这是什么的细节。
答案 1 :(得分:1)
如果您有2D数组,则不能简单地将其转换为指向指针的指针。指针和数组不一样。
如果你想要长度超过19的字符串,那么你需要使用char (*)[20]
来使字符串的数量变得灵活,如@AnT所指出的那样。
注意:使用20
作为维度意味着您最多可以包含19
个字符,因为一个空格必须占用空终止字符\0
。
以下是一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRLEN 20
#define NUMSTR 10
int main(void) {
char buffer[NUMSTR][STRLEN];
strcpy(buffer[0], "Hello");
strcpy(buffer[1], "World");
char (*finalized)[STRLEN] = buffer;
printf("%s %s!\n", finalized[0], finalized[1]);
return 0;
}