2

パラメータの受け渡し中にこのエラーを理解できません。

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

typedef char my_char;

void myfunc(const my_char** data)
{
    printf ("%s\n", *data);
    printf ("%s\n", *(data + 1));
}

int main(){

    char **mydata;
    mydata = malloc(sizeof(char*)*2);
    mydata[0] = malloc(sizeof(char)*50);
    mydata[1] = malloc(sizeof(char)*50);

    memset(mydata[0],'\0',50);
    memset(mydata[1],'\0',50);
    strcpy (mydata[0], "Hello");
    strcpy (mydata[1], "world");

    myfunc((my_char**)mydata);

    free (mydata[0]);
    free (mydata[1]);
    free (mydata);

    return 0;
}

正常に動作します。ただし、引数を明示的に型キャストすると警告が表示されます。これはなぜですか?表示される警告は次のとおりです。

warning: passing argument 1 of ‘myfunc’ from incompatible pointer type

私の知る限り、型キャストは、ポインターが保持しているデータの型をコンパイラーが理解するのに役立つはずです。しかし、ここではまったく役に立ちません。

4

3 に答える 3

0

を削除constし、const を追加すると、渡された引数の型が宣言と混同され、次のようにデータ要素が型キャストされます。

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

typedef char my_char;

void myfunc(my_char** data)
{
    printf("%s\n", *data);
    printf("%s\n", *(data + 1));
}

int main(){

    char **mydata;
    mydata = (char **)malloc(sizeof(char*)* 2);
    mydata[0] = (char *)malloc(sizeof(char)* 50);
    mydata[1] = (char *)malloc(sizeof(char)* 50);

    memset(mydata[0], '\0', 50);
    memset(mydata[1], '\0', 50);
    strcpy(mydata[0], "Hello");
    strcpy(mydata[1], "world");

    myfunc((my_char**)mydata);

    free(mydata[0]);
    free(mydata[1]);
    free(mydata);

    return 0;
}
于 2015-01-13T09:02:07.480 に答える
0

void myfunc( const my_char** data) 、つまり void myfunc(my_char** data) から const を削除するか、型キャスト中に const 、つまり myfunc(( const my_char**)mydata);を提供します。

于 2015-01-13T09:04:17.113 に答える