首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查指针拼图

查指针拼图
EN

Stack Overflow用户
提问于 2017-05-21 15:52:18
回答 2查看 95关注 0票数 0

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

假设我有这样的设置:

代码语言:javascript
复制
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;
}

我想要的是主要访问msg。我不希望雷弗返回msg,我希望它返回一个int。而且,总的来说,我不知道味精的大小。

理想情况下我会有这样的东西

代码语言:javascript
复制
int main() {
    char * msg;
    int numbytes = receive(i, msg); 
    // And be able to access msg here
}

但这不管用。我想我的问题是与指针和参考传递有关。有什么办法让这件事起作用吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-21 16:07:29

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

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

代码语言:javascript
复制
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))

如果您确实想做一些与我前面描述的类似的事情,那么应该是:

代码语言:javascript
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2017-05-21 16:03:01

您必须在C中传递一个指向变量的指针,以便“通过引用传递”。要从调用的函数中将数据输入char *变量,函数必须使用char *的地址。字符指针地址的语法如下: char** (一个星号表示指针,另一个星号表示指针指向"char *",一个字符指针变量)。给定给"char * *“参数的值是char *变量的地址:&msg。然后在函数内部取消char **变量-- *address_of_msg --分配给函数外部的msg变量。

代码语言:javascript
复制
#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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44098838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档