0

(文字列への)ポインタの2次元配列があります

 char *result[7000][14];

各「行」の最初の文字列を返す関数を書きたいと思います。

これが私が試したことです:

char *getRownames (int a, int b, char *matrix[a][b])
{
    char *rownames[a];
    for(int i=0;i<a;i++){
        rownames[i] = malloc(strlen(matrix[i][0])+1);
        strcpy(rownames[i],matrix[i][0]);
    }

    return *rownames;
}

その後

 char *names = getRownames(7000, 14, result);

getRowNames のタイプが競合しているというエラーが表示されます。まだ C に慣れており、自分のメモリを割り当てなければなりません。

4

2 に答える 2

1

ここにはいくつかの問題があります

  • return ステートメントが間違っています (*rownames ではなく、rownames である必要があります)。とにかく私はそのようにはしません。
  • コードの残りの部分はわかりませんが、を初期化しない*result[][0]と、strlen 呼び出しでセグメンテーション違反が発生する可能性が高くなります。
  • そのサイズのスタック上の配列へのポインターを返そうとすることは避けます (malloc されていないローカル変数へのポインターを返さないでください)。あなた。そのサイズのデータ​​へのポインターを malloc していれば、問題ありませchar *rownames=malloc(a*sizeof(char *)); ん。

だから私は自分のテストコードでこれをやった:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void getRownames (int a, int b, char *matrix[a][b], char* rownames[a])
{
    int i;
    for(i=0;i<a;i++){
        //printf("%d\n",strlen(matrix[i][0]));
        rownames[i] = malloc(strlen(matrix[i][0])+1);
        strcpy(rownames[i],matrix[i][0]);
    }
    //strlen(matrix[i][0])
    //return &rownames[0];
}

int main(void) {
    char *result [700][14];
    int i=0;
    for(i=0;i<700;i++){
    result[i][0]="abcd0";
    }
    char *rownames[700];
    getRownames(700,14,result,rownames);
    printf("I finished");
    printf("%s",rownames[0]);
    printf("%s",rownames[1]);
    printf("%s",rownames[2]);
    printf("%s",rownames[3]);
}
于 2012-04-17T19:47:43.870 に答える
0

ここでいくつかのことが起こっています。

関数宣言/プロトタイプは、配列と行列のサイズが固定されている必要があります。*

char *getRownames (int a, int b, char *matrix[a][b])

コンパイラがプログラムを認識していないため、aまたはコンパイル時に機能しません。bそれはする必要があります

char *getRownames (int a, int b, char *matrix[7000][14])

配列がそのサイズになることがわかっている場合。その後、あなたは必要がないab、まったくありません。さまざまなサイズの行列を関数に渡せるようにしたい場合、それはまったく別の問題です。

*(コンパイラでは配列の最初の次元を省略できることに注意してください:char *matrix[][14]またはchar *array[]

次に、malloc()がvoid *を返すため、mallocからchar*に戻り値をキャストする必要があります。

rownames[a] = (char*)malloc(strlen(matrix[i][0])+1);

ちなみに、それはrownames[i]あなたのループにあるはずです。:-)iループ変数なので。

最後に、char *の配列を返したいようですが、配列return *rownamesの最初の値だけを返します。繰り返しになりますが、配列のサイズがわかっている場合は、既存の配列を関数に渡して値を入力する方が簡単です。それ以外の場合は、配列をmallocして返す必要があります。

char *result[7000][14];
char *firstRows[7000];
//... other code that fills in these values
getRownames(7000, 14, result, firstRows);

void getRownames (int a, int b, char* matrix[7000][14], char* returnrows[7000])
{
    for(int i=0;i<a;i++){
        returnrows[i] = (char*)malloc(strlen(matrix[i][0])+1);
        strcpy(returnrows[i],matrix[i][0]);
     }
}
于 2012-04-17T19:55:42.987 に答える