操纵指针和函数

时间:2014-08-10 16:00:30

标签: c function pointers

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

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: %s\n", clientNames[i]  );

    }while ( i != people - 1) ; 

    clientNames[i+1] = malloc( sizeof("\0") ) ;
    clientNames[i+1] = "\0" ; 

    return clientNames ; 
}

int main(){
    int i = 0 ; 
    char **C;
    C = getData() ;   
    printf("Stoped saving.\n");
    for (i=0 ; strcmp(C[i] , "\0")  ; i++ ){
        printf("%s\n", C[i] );
    }   
    return 1 ; 
}

所以我有 2个问题

1)当编译上面的代码(gcc)时,我收到警告:警告:赋值使得整数指针没有强制转换[默认启用] 。为了使这个警告消失,可以做些什么?我尝试更改getData()的返回类型,但仍然是相同的警告。

2)如何修改此代码,以便在main()中创建的char C作为getData()中的参数传递?然后getData应该能够更改其内容并返回** C.

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

2 个答案:

答案 0 :(得分:3)

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

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: %s\n", 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("%s\n", C[i]);
        free(C[i]);
    }
    free(C);
    return 0;
}

我遗漏了malloc之后和free之前所需的断言,但你通常也需要它们......

答案 1 :(得分:1)

  

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;
    ...

并在main()中:

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