2017-02-04 43 views
1

我有至多20长度的10个字符串数组,我建立如何将char [n] [length + 1]转换为C中的常量字符串数组?

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] 

做有一个字符串的工作

类似的东西
char buffer[20] = {0}; 
//populate the buffer 
const char *finalized = buffer; 

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

+0

'{0}'是* *一个维阵列的初始值设定。 –

+3

@ Eugene Sh .:没有。而且,这是荒谬的。在C语言中,'{0}'是一个惯用的通用零初始化器。它可以用来绝对*初始化*任何*。 – AnT

+0

是的,但并非没有抱怨,例如'警告:初始化程序周围缺少大括号[-Wmissing-braces]'。 (作为'-Wall'的一部分启用) –

回答

4

无法将常规二维数组“铸造”为指针指针类型。这些类型完全不兼容,并且具有完全不同的语义。你可以强制施放,但结果无用。

形式上,在这种情况下,正确的指针类型是char (*)[20]

char (*finalized)[20] = buffer; 

除了C语言是常量,正确性规则不会允许你添加一个const那里。您可以强制它虽然

const char (*finalized)[20] = (const char (*)[20]) buffer; 

你也可以做

char (*finalized)[10][20] = &buffer; 

无论这是任何使用你的 - 我不知道,因为你不提供有关什么是对任何细节。

+0

我想将已完成的数组传递给execv。在'man 3 exec'中,我看到execv需要一个'char * const argv []',这有帮助吗?必须有一些方法来施放,否则你怎么可以用可变参数使用exec? – nullUser

+1

@nullUser:演员阵容不会帮助你。你将不得不单独构建'argv'。 'argv'是一个*指针数组*。你的'buffer'是一个*数组array *,这是一个完全不同的东西。看到这里:http://stackoverflow.com/a/2275818/187690进一步的细节。 – AnT

+1

@nullUser你应该在问题 –

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; 
} 
+0

中提到你的要求在分配*字符串*的情况下,你可以简单地执行'char * buffer [] = {“Hello”,“World”); printf(“%s%s \ n”,buffer [0],buffer [1]);' –

+0

@ DavidC.Rankin它很难与'buffer [10] [20];'整合。我相当肯定使用这种方法最终会出现相互冲突的类型。也许'strncpy'会是一个更好的选择。 – RoadRunner

相关问题