字符指针拼图
Char pointer puzzle
我是 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。
不过,我不想收到 return 消息,我希望它收到 return 一个整数。
另外,主要是,我不知道味精的大小。
理想情况下我会有类似
的东西
int main() {
char * msg;
int numbytes = receive(i, msg);
// And be able to access msg here
}
但这行不通。我想我的问题与指针和引用传递有关。关于如何让它发挥作用的任何想法?
为了 "pass by reference",您必须在 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);
}
用指针做这样的事情是完全正常的。但这可能有点棘手。如果函数执行内存分配,则必须将指向指针的指针作为参数传递,这是可能的,但不是很常见。 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);
我是 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。 不过,我不想收到 return 消息,我希望它收到 return 一个整数。 另外,主要是,我不知道味精的大小。
理想情况下我会有类似
的东西int main() {
char * msg;
int numbytes = receive(i, msg);
// And be able to access msg here
}
但这行不通。我想我的问题与指针和引用传递有关。关于如何让它发挥作用的任何想法?
为了 "pass by reference",您必须在 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);
}
用指针做这样的事情是完全正常的。但这可能有点棘手。如果函数执行内存分配,则必须将指向指针的指针作为参数传递,这是可能的,但不是很常见。 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);