C编程指针和char数组问题

时间:2011-12-15 10:03:36

标签: c

我想将数组的内容传递给另一个方法并让该方法打印出整个数组 - 我该怎么做?

目前:

我正在从函数返回一个数组。

    char* search_value(struct PDB *llist)
{
    int realID = -7; 
    int x = 0; 
    int task = 0; 
    char *received; 
    char theMessage[100]; 
    theMessage[0] = '\0';


    printf("Your choice: `Search'\n");
    printf("Enter the value you want to find: ");
    scanf("%d", &task);

    while(llist->data1 != NULL)
    {

        if(task == llist->taskID)
        {
            realID = llist->taskID; 
            strcpy(theMessage, llist->data1); 


            break; 
        }

    }

    return theMessage; 
}

我得到了返回值:

 void getMessage(const int GET_MESSAGE)
{
    char * received = NULL;
    int x = 0; 
    received = search_value(llist);

    printf("%s", received); 

}

我想以某种方式打印整个值(而不仅仅是指针指向的第一个值 - 我该怎么做?

4 个答案:

答案 0 :(得分:2)

一些更正,它应该有效:

// - struct contents shouldn't be changed by the function, make its pointer const.
// - pass a pointer to an allocated array as parameter
char* search_value(const struct PDB *llist, char* theMessage)
{
    int realID = -7;
    int x = 0;
    int task = 0;
    char *received;
    theMessage[0] = '\0';


    printf("Your choice: `Search'\n");
    printf("Enter the value you want to find: ");
    scanf("%d", &task);

    while(llist->data1 != NULL)
    {

        if(task == llist->taskID)
        {
            realID = llist->taskID;
            strcpy(theMessage, llist->data1);


            break;
        }

    }

    return theMessage;
}


void getMessage(const int GET_MESSAGE)
{
    char received[100]; // allocate the array outside the function
    int x = 0;
    search_value(llist, received); // pass a pointer to the first element

    printf("%s", received);

}

答案 1 :(得分:1)

这里有一个变量范围的问题:theMessage是函数search_value的本地问题,所以你返回一个指向一个函数完成后不再存在的数组的指针。

相反,您应该使用malloc()theMessage分配空间,然后在功能完成之后随后free()分配空间 - 但这通常会导致如果你不勤奋地清理自己,那就要记忆泄漏。

您可以像这样分配内存:

char * message = malloc(100);

另一种方法是在getMessage()中分配缓冲区并将指向缓冲区的指针传递给search_value,然后可以将其写入其中:

void getMessage(const int GET_MESSAGE)
{
    char received[100];
    int x = 0; 
    search_value(llist, received);
    printf("%s", received); 
}

void search_value(struct PDB *llist, char * buffer)
{
    // write to buffer
}

另一种选择是在char *内声明getMessage()指针,将指针传递给指向search_value()的指针,然后再次使用malloc()为缓冲区分配空间。 / p>

最后,这是一个次要的风格批评,但你要学会坚持一个约定你的功能的约定,search_valuegetMessage不是一致的名字,这将是不愉快的许多与你合作的编码员。

答案 2 :(得分:1)

您的代码有几个问题。我猜你想要在列表中搜索某个值,然后返回该值。

第一个问题是你实际上没有遍历列表,而只是一遍又一遍地检查同一个项目。另一个问题是您返回一个指向局部变量的指针。这是未定义的行为,因为只要函数返回指针指向的内存,就可以用于其他内容。

我建议您按如下方式更改代码:

char *search_value(struct PDB *llist, char *theMessage, size_t theMessageMaxLength)
{
    int realID = -7; 
    int task = 0; 

    printf("Your choice: `Search'\n");
    printf("Enter the value you want to find: ");
    scanf("%d", &task);

    while(llist != NULL && llist->data1 != NULL)
    {
        if(task == llist->taskID)
        {
            realID = llist->taskID; 
            strncpy(theMessage, llist->data1, theMessageMaxLength);
            theMessage[theMessageMaxLength] = '\0';
            break; 
        }
        llist = llist->next;  /* Assuming the field is named "next" */
    }

    return theMessage; 
}

void getMessage(const int GET_MESSAGE)
{
    char *received = NULL;
    char theMessage[100];

    /* Subtract 1 from the size, for the terminating '\0' */
    received = search_value(llist, theMessage, sizeof(theMessage) - 1);

    printf("%s", received); 
}

答案 3 :(得分:0)

您要返回的数组是该函数的本地数组。 calle函数应提供它期望值的数组或使用静态数组。