Char指针拼图

时间:2017-05-21 15:52:19

标签: c pointers char char-pointer

我是c的新手并尝试套接字编程。我有关于指针的问题。

说我有这样的设置:

int main() {
    ... // some code
    int numbytes = receive(i); 
}

int receive(int num) {
    ... // some code
    msgLength = ... // some code
    char msgWithLength[4 + msgLength]; 
    int n = getMsg(clientSocket, msgWithLength, 4 + msgLength);
    char * msg = unpack(msgWithLength, 4);
    return n; 
}

char * unpack(char *msgWithHeader, int headerSize) {
    char *msg = ... // some code to remove header from msgWithHeader
    return msg;
}

我想要的是在main中访问msg。 我不想收到返回msg,我希望它返回一个int。 另外,在main中,我不知道msg的大小。

理想情况下我会有像

这样的东西
int main() {
    char * msg;
    int numbytes = receive(i, msg); 
    // And be able to access msg here
}

但这不起作用。我想我的问题与指针有关,并通过引用传递。关于如何使其发挥作用的任何想法?

2 个答案:

答案 0 :(得分:1)

你必须在C中传递一个指向你的变量的指针才能“通过引用传递”。要从您调用的函数将数据转换为char *变量,该函数必须获取char *的地址。字符指针地址的语法如下所示:char **(一个用于表示指针的星号,另一个用于表示指针指向“char *”的星号,一个字符指针变量)。赋予“char * *”参数的值是char *变量的地址:& msg 。然后在函数内部取消引用char **变量 - * address_of_msg - 以分配给函数外部的msg变量。

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

int receive(int a, char **address_of_msg)
{
  *address_of_msg = malloc(200);
  strcpy(*msg,"modified in subroutine");
  return 10;
}

int main(void)
{
  char *msg;
  int return_value;
  return_value = receive(20,&msg);
  printf("return value: %d msg: %s\n",return_value,msg);
}

答案 1 :(得分:1)

使用指针做类似的事情是完全正常的。但它可能有点棘手。如果函数执行内存分配,则必须将指针作为参数传递给指针,这是可能的,但不是很常见。 Apache Portable Runtime库使用了这种技术。

将指针传递给缓冲区并将缓冲区的大小作为参数传递更为常见,如下所示:

int your_read(int fd, char *buf, size_t len) {
    return read(fd, but, len);
}
// called using e.g.:
char the_buffer[1024];
your_read(0, the_buffer, sizeof(the_buffer))

如果你想做一些与我先描述的相似的事情,那就是:

int create_object(struct example **e) {
    *e = malloc(sizeof(**e));
    if (*e == NULL)
        return -1;
    (*e)->name = "example";
    return 0;
}
// called using:
struct example *the_example;
create_object(&example);