我在c。
中使用fopen()时遇到问题当我编译并运行它时:
const char* mode="r";
FILE* imgstream = fopen(pathinput, mode);
我收到了分段错误:
main called
argv[1]: /home/student/workspace/Flip/res/test.pbm
open mode: r
./testscript: line 6: 12454 Segmentation fault ./flippr /home/student/workspace/Flip/res/test.pbm /home/student/workspace/Flip/test_out.pbm
在我看来它应该正常工作...... 我做错了什么?
main.c的整个代码:
#include "flip.h"
#include "img.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int pbm_image_flip(PbmImage* image){
return 0;
}
int main(int argc, char **argv) {
#ifdef DEBUG
printf("main called\n");
#endif
int* error=RET_PBM_OK;
#ifdef DEBUG
printf("argv[1]: %s\n", argv[1]);
#endif
const char* mode="r";
#ifdef DEBUG
printf("open mode: %s\n", mode);
#endif
FILE* imgstream = fopen(argv[1], mode);
#ifdef DEBUG
printf("imgstream fopen");
#endif
PbmImage* pbmimage=pbm_image_load_from_stream(imgstream, error);
pbm_image_flip(pbmimage);
return 0;
}
代码运行直到我尝试打开流之前。
答案 0 :(得分:3)
错误来自这一行:
const char* mode='r';
C中的单引号和双引号之间存在差异。单个字符用于字符,双字符串用于字符串文字(可以安全地分配给char*
)
你的解决方案是
FILE* imgstream = fopen(pathinput,"r");
答案 1 :(得分:1)
还有一个问题:
int* error = RET_PBM_OK;
会崩溃或稍后会导致崩溃。您正在使用未初始化的指针。
写下这个:
int error = RET_PBM_OK ;
...
PbmImage* pbmimage=pbm_image_load_from_stream(imgstream, &error);
但这是不好的做法。通常pbm_image_load_from_stream
如果成功,则负责设置RET_PBM_OK的错误。在这种情况下,您甚至无需在致电error
之前初始化pbm_image_load_from_stream
。