2

char *を渡して別の関数に変更しようとしていますが、どういうわけかセグメンテーション違反が発生し続けています。

完全なコードは次のとおりです。

#include <stdio.h>

void getString(char** str) {
    *str[0] = '$';
    char c;
    int i = 1;
    while ((c = getchar()) != '$') {
        if (c != '\n') {
            *str[i-1] = c;
            i++;
        }
    }
    *str[i] = '\0';
}

int main (int argc, char *argv[]) {

    char* str =  (char*)malloc(200 * sizeof(char));
    while (1) {
        getString(&str);
        printf("String: %s\n",str);
    }
    return 0;
}

str [0] ='$'から*を取得すると、整数へのポインタを渡す警告が表示されます。

私がめちゃくちゃしているダンノ。

4

2 に答える 2

4

配列インデックス、[]、演算子は、間接参照演算子、*よりも優先順位が低くなります。

したがって、コードを変更する必要があります

 (*str)[0] = '$';
 (*str)[i-1] = c;
 (*str)[i] = '\0';

あなたの場合、あなたはあなたのポインタのアドレスを渡す必要はありません、ただポインタを渡すだけです:

getString(str);

そして、としてそれにアクセスします

str[0] = '$';  
str[i-1] = c;
str[i] = '\0';

malloc()を使用しているので、必ず追加し#include <stdlib.h> てください。Cでは不要なmallocの戻り値をキャストしなかった場合は、これに関する警告が表示されるはずです。

于 2012-12-11T13:13:42.183 に答える
0

作成してから新しいバッファを返すのではなく、既存のバッファの内容を変更したいので、代わりに渡すchar*ことができますgetString

#include <stdio.h>

void getString(char* str) {
    str[0] = '$';
    char c;
    int i = 1;
    while ((c = getchar()) != '$') {
        if (c != '\n') {
            str[i-1] = c;
            i++;
        }
    }
    str[i] = '\0';
}

int main (int argc, char *argv[]) {

    char* str =  malloc(200);
    while (1) {
        getString(str);
        printf("String: %s\n",str);
    }
    return 0;
}

また、メモリ割り当てにいくつかの変更を加えたことに注意してください。 は1であることが保証されているため、省略でき、Cでsizeof(char)からのリターンをキャストする必要はありません。malloc

于 2012-12-11T13:12:15.727 に答える