2017-02-04 109 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

相關問題