C语言 操作指针和函数



虽然我已经学习C 4个月了,但我在操作指针方面遇到了困难,特别是当必须将它们作为函数参数传递时。我有下面的小代码:

int getData(){
    int i = -1  , people ;
    char **clientNames ; 
    printf("Enter the number of people you want to save: ");
    scanf("%d" , &people ) ; 
    clientNames = malloc( people * sizeof(char *) ) ;
    do{
        i++ ;
        char temp[60] ;
        printf("Enter Full Name: ");
        scanf("%s" , temp ) ; 
        clientNames[i] = malloc( sizeof(temp) ) ; 
        strcpy( clientNames[i] , temp )  ;
        printf("Saved as: %sn", clientNames[i]  );
    }while ( i != people - 1) ; 
    clientNames[i+1] = malloc( sizeof("") ) ;
    clientNames[i+1] = "" ; 
    return clientNames ; 
}
int main(){
    int i = 0 ; 
    char **C;
    C = getData() ;   
    printf("Stoped saving.n");
    for (i=0 ; strcmp(C[i] , "")  ; i++ ){
        printf("%sn", C[i] );
    }   
    return 1 ; 
}

所以我有2个问题:

1)当上面的代码被编译(gcc)时,我得到警告:警告:赋值使指针从整数没有强制转换[默认启用]。怎样做才能使这个警告消失呢?我尝试改变getData()的返回类型,但仍然,相同的警告。

2)如何修改这段代码,以便在main()中创建的char C **作为getData()中的参数传递 ?那么getData应该能够改变它的内容并返回** c。

这毕竟是指针的值,对吧?:)

我会告诉你应该修改哪些行来完成你的代码,但你几乎需要更改所有内容,所以阅读下面的代码并尝试跟踪差异:

char** getData()
{
    int i, people;
    char** clientNames;
    char temp[60];
    printf("Enter the number of people you want to save: ");
    scanf("%d", &people);
    clientNames = malloc((people+1)*sizeof(char*));
    for (int i=0; i<people; i++)
    {
        printf("Enter Full Name: ");
        scanf("%s", temp);
        clientNames[i] = malloc(strlen(temp)+1);
        strcpy(clientNames[i], temp);
        printf("Saved as: %sn", clientNames[i]);
    }
    clientNames[people] = NULL;
    return clientNames;
}
int main()
{
    int i;
    char** C = getData();
    printf("Stoped saving.n");
    for (i=0; C[i]!=NULL; i++)
    {
        printf("%sn", C[i]);
        free(C[i]);
    }
    free(C);
    return 0;
}

我省略了malloc之后和free之前所需的断言,但您通常也需要它们…

1)当上面的代码被编译(gcc)我得到警告:警告:赋值使指针从整数变为没有强制类型转换的指针默认)。怎样做才能使这个警告消失呢?我尝试更改getData()的返回类型,但仍然是相同的警告。

改变
int getData(){

char** getData(){

,因为您从函数返回char**,而不是int。毕竟,您还应该释放已分配的内存。

2)如何修改这段代码,使char C在main()是**作为getData()的参数传递?那么getData应该可以更改其内容并返回** c。

在C中,参数是按值传递的。为了从main传递一个指针到你的函数,你需要传递它的一个地址。因此,getData()函数中需要一个指向C的指针,要对C变量进行操作,就必须对其解引用。如果将C传递给getData(),则不需要返回它。所以,它会像这样:

void getData(char*** C){
    char** clientNames = *C;
    ...

and in main():

...
char** C;
getData(&C);
...

最新更新