2017-02-04 10 views
1

は私がCで文字列の定数配列にchar [n] [length + 1]をキャストする方法はありますか?

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; 

を構築していますほとんどの20の長さの10個の文字列の配列を持っていますが、以前は警告

warning: initialization from incompatible pointer type [-Wincompatible-pointer-types] 

つの文字列と類似した何かをすることに失敗した

作品
char buffer[20] = {0}; 
//populate the buffer 
const char *finalized = buffer; 

最初のケースでキャストする正しい方法は何ですか?

+0

は '{0}' *の1 *次元配列の初期化です。 –

+3

@Eugene Sh .:いいえさらに、それは不合理です。 C言語では '{0}'は慣用的な汎用ゼロ初期化子です。これは絶対に何かを0に初期化するのに使うことができます。 – AnT

+0

はい、申し訳ありません。 '警告:イニシャライザ[-Wmissing-braces]の周囲にカッコがありません。 ( '-Wall'の一部として有効になります) –

答えて

4

通常の2D配列をポインタ型にキャストすることは不可能です。これらの型は完全に互換性がなく、全く異なるセマンティクスを持ちます。あなたはキャストを強制することができますが、とにかく結果は役に立たなくなります。

正式には、この場合は、適切なポインタ型は、C言語のそれのconst正しさのルールを除くchar (*)[20]

char (*finalized)[20] = buffer; 

ですが、あなたがそこにconstを追加することはできません。あなたはそれがために何についての詳細情報を提供していないので、私は知らない - あなたはまた、これはあなたにどんな使用であるかどうか

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

を行うことができます

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

けれどもあなたはそれを強制することができます。

+0

ファイナライズされた配列をexecvに渡したいと思います。 'man 3 exec'では、execvが' char * const argv [] 'を必要とすることがわかります。これは役に立ちますか?キャストするには何らかの方法が必要です。そうでなければ、どのように可変引数を使ってexecを使うことができますか? – nullUser

+1

@nullUser:キャストはここでお手伝いしません。その 'argv'を個別に構築する必要があります。 'argv'はポインタ*の配列です。あなたの 'buffer'は配列*の配列です。これはまったく別のものです。詳細はこちら:http://stackoverflow.com/a/2275818/187690 – AnT

+1

@nullUserあなたは質問の中であなたの要件を言及するべきです –

1

2D配列を使用している場合は、単純にポインタへのポインタに変換することはできません。ポインタと配列は同じではありません。

文字列の長さを19より長くしたい場合は、char (*)[20]を使用して@AnTが指すように、この場合は文字列の数を柔軟にする必要があります。

注:寸法は1つのスペースは文字\0を終了ヌルを占有しなければならないので、あなたが、最も19文字で持つことができることを意味する20を使用して。ここ

は一例であり:

#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 ");バッファ[0]、バッファ[1]); ' –

+0

@ DavidC.Rankinそのバッファを 'buffer [10] [20];で統合するのは少し難しいです。私はかなりそれが矛盾するタイプに終わると確信しています。おそらく 'strncpy'が良い選択肢になるでしょう。 – RoadRunner

関連する問題