【问题标题】:sending a struct to a function, previously defined with a pointer将结构发送到函数,之前用指针定义
【发布时间】:2010-09-15 03:12:51
【问题描述】:

编辑:算了。它是代码的另一部分(实际上问题是次要元素。另一个指针但没有用 malloc 分配,只是声明了,所以我认为内存是在另一个地方分配的)。该示例现在可以编译。

谢谢大家。我很抱歉我的错别字,但英语不是我的母语(不是一个好的escuse,但我会更加努力)。


嗨。我想将一些元素(在结构中)传递给函数,但我无法以任何方式读取元素(段错误)

#define _FILE_OFFSET_BITS 64
#define _LARGEFILE_SOURCE
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>   
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include "pcre.h"
#include <arpa/inet.h>
#define BUFFER 1512


typedef struct OCR {
    unsigned long int       ocr;
    struct OCR *         prev;
    struct OCR *         next;
} ip_ocr;


int sending (ip_ocr * tmp) {
    printf("%p\n",tmp); //this outpuut
    printf("%lu",tmp->ocr); // at this point i get a seg fault
    return 0;

}

int main () {
    ip_ocr * list;
    list=malloc(sizeof(ip_ocr));
    list->ocr=1;
    list->next=NULL;
    list->prev=NULL;

    sending(list);


 }    

【问题讨论】:

  • 这不可能是你的代码:它缺少几个分号和#include 行。另外,由于某种原因,尝试添加类似printf("tmp: %p\n", tmp); at the start of sending: I think you might be getting a NULL`指针的东西。当我编译您的代码时(在修复包含和语法错误之后),我没有收到段错误。
  • 刚刚他们关闭了虚拟服务器。但我检查了指针并没有为空。我会重新检查我的代码(我只是在这里发布了它的关键部分)我会在他们再次打开机器时再次检查。
  • 不要解释代码;它使其他人很难确定实际代码中存在哪些错误以及通过重新输入代码引入了哪些错误。但是,如果您必须解释,您应该发布可以重现问题的最小示例
  • 谢谢,但实际代码有几行。再次感谢:D

标签: c pointers data-structures


【解决方案1】:

经过几次修复,它可以在我的机器上运行。

包括系统标题:

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

在这些行之后添加分号:

printf("%lu",tmp->ocr);
return 0;

为从 malloc 返回的值添加(不必要的)类型转换:

list=(ip_ocr*)malloc(sizeof(ip_ocr)); /* oops, not needed */

【讨论】:

  • C 不需要那种类型转换。
  • Matthew 是正确的,不需要 malloc 的返回值的类型转换。我出于使用 C++ 的习惯添加了它。
  • 我猜不仅不需要它,它还会混淆 OP 遇到的错误。由于他没有包含标题,因此返回类型被解释为int。所以最终以list 结尾的指针完全偏离了轨道。我认为现在的每个编译器都会发出警告,说明 OP 必须慷慨地忽略了这一点。
【解决方案2】:

我认为您一定忽略了malloc 的返回已被视为int 的警告。然后你的list 就完全出错了。

  • 包含正确的头文件
  • 始终使用-Wall 或编译 等效
  • 改进你的代码,直到它没有 吐出任何警告

【讨论】:

  • 我们必须得出结论,代码被编译为 LP64,因为,如果它被编译为 32 位代码,意外地将指针视为 int 不会出现段错误(在所有现实世界的 C 实现中,我用过)。
  • @JeremyP:是的,这也是我的猜测。我们也可以得出结论,我们会越来越频繁地看到这种错误。
  • 实际上它是在 X86_64 中编译并使用大文件支持和 malloc 不会给我任何警告(我总是用 -Wall 编译)
【解决方案3】:

使用-Werror-implicit-function-declaration-Werror=return-type 进行编译可防止在C 中发生此类事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多