2010-09-15 40 views
0

编辑:忘记它。它是代码的另一部分(实际上问题是次要元素,另一个指针,但没有用malloc分配,只是声明,所以我认为内存分配在另一个地方)。这个例子现在可以编译。发送一个结构到一个函数,以前用指针定义

谢谢你们。即时通讯对不起我的错别字,但英语不是我的母语(不是一个好的借口,但我会更努力)。


嗨。我想通过一些元素(一个结构)的功能,但一些修正后,我无法读取任何方式的元素(赛格故障)

#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); 


}  
+1

那不可能是你的代码:它缺少s几个分号和'#inc'行。另外,尝试添加类似'printf(“tmp:%p \ n”,tmp);在'sending'开始的时候:我想你可能会因为某种原因得到一个NULL指针。当我编译你的代码时(修正include和语法错误之后),我没有得到段错误。 – 2010-09-15 03:31:51

+0

刚刚他们插上了虚拟服务器。但我检查了指针并且不是null。我会重新检查我的代码(我刚刚发布了它的关键部分),当他们再次打开机器时,我会再次检查。 – Freaktor 2010-09-15 03:50:05

+1

不要解释代码;它使得其他人难以确定实际代码中的错误以及重新输入错误的方式。然而,如果你必须解释,你应该发布可以重现问题的最小样本*。 – jamesdlin 2010-09-15 05:27:22

回答

3

它的工作在我的机器上。

包括系统头:

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

这些行后面添加分号:

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

增加(不必要的)强制转换为数值从malloc返回:

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

C不需要类型转换。 – 2010-09-15 04:43:08

+0

马修是正确的,malloc的返回值的类型转换是不需要的。我习惯于使用C++添加它。 – Blastfurnace 2010-09-15 04:57:56

+0

不仅它不是必需的,而且它混淆了OP遇到的错误,我想。由于他没有包含头文件,返回类型被解释为一个'int'。所以最终以'list'结尾的指针完全偏离轨道。我认为现在的每个编译器都会给出一个警告,说明OP应该慷慨地忽略这个问题。 – 2010-09-15 06:42:20

1

我认为你必须忽略一个警告,malloc的回报已被采用是一个int。您的list然后完全错误。

  • 包括正确的头文件
  • 总是编译-Wall或 相当于
  • 提高你的代码,直到它不 吐出所有
+0

我们必须得出结论,代码被编译为LP64,因为它被编译为32位代码,意外地将一个指针视为一个int将不会seg错误(在我曾经使用过的所有实际的C实现中)。 – JeremyP 2010-09-15 08:31:27

+0

@JeremyP:是的,这也是我的猜测。我们也可以得出结论,我们会越来越频繁地看到这种错误。 – 2010-09-15 09:40:51

+0

实际上它是在X86_64中编译的并且使用bigfiles支持,而malloc不会给我任何警告(我总是用-Wall编译) – Freaktor 2010-09-16 00:48:50

0

任何警告与-Werror-implicit-function-declaration-Werror=return-type编译防止这些事情发生在C.

相关问题