2011-01-05 10 views
1

、私は元の配列をinitalize、その後、I memcpyを使用して、2つのアレイを新しいアレイにコピーします。C配列の連結問題

int main(int argc, char *argv[]) { 
    char *args1[] = {"foo","bar"}; 
    char **args = (char**) calloc(argc, sizeof(char*)); 
    memcpy(args, args1, sizeof(char*) * 2); 
    memcpy(args + sizeof(char*) * 2, argv+1, sizeof(char*) * (argc-1)); 

が、私はこの

printf("%s %s %s\n", args[0], args[1], args[2]); 

を実行し、その後、私は

の結果を得る

./testバズ

を実行します

foo bar

私の2番目のmemcpyがどこで失敗したのか分かりませんが、見つけられません。どんな助け?前もって感謝します。

答えて

5

このコードには2つの問題があります。あなたはポインタ演算が混乱している2

問題#1

calloc(argc, sizeof(char*)) 

問題#

calloc(argc + 2, sizeof(char*)) 

でなければなりません。この部分

args + sizeof(char*) * 2 

は、単にあなたがタイプのサイズによって相殺増殖しない、

&args[2] 

いずれかの方法で使用することができ、また

args + 2 

でなければなりません。コンパイラは自動的にそれを行います。

+0

sigh。私はポインタ算術を知っているので、私はその種のエラーを作り、それに気づかないのは愚かでした。それは私がrosettacodeからポインタを取る最後の時間です –