如何将char [n] [length + 1]转换为C中的常量字符串数组?

时间:2017-02-04 02:52:14

标签: c arrays

我有一个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]

在第一种情况下投射的正确方法是什么?

2 个答案:

答案 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;
}