该函数返回指向char的指针。
函数内部的调试器显示指针的值为"0xfffffff9590"
(7倍F),我可以在此地址看到一个字符串。
捕获函数结果的指针具有(如调试器所示)值"0xffffffffffff9590"
(12倍F),调试器表示它无法访问该内存。当我尝试printf
指针时segmentation fault
。我究竟做错了什么?
我在控制台中使用2个参数进行测试。为了调试参数,我添加了它们。所以,没关系。
~/Projects/t2/bin/Debug$ ./t2 aaa bbb
Configuration folder = [aaa]
titleFP = [aaa/title.txt]
Segmentation fault (core dumped)
xxx@pc0:~/Projects/t2/bin/Debug$
//const.h
#ifndef CONST_H
#define CONST_H
extern const uint16_t maxStrLen;
extern const char *sep;
extern const char *titleFN;
#endif
//const.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "const.h"
extern const uint16_t maxStrLen = 1024 * 16;
extern const char *sep = "/";
extern const char *titleFN = "title.txt";
//main.h
#ifndef MAIN_H
#define MAIN_H
#include "const.h"
extern char *path_cfg;
extern char *path_out;
#endif
//main.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "main.h"
#include "const.h"
// FORGOT #include "str.h" !!! AAAAA!!!! )))
int main(int argc, char* argv[])
{
char titleFP[maxStrLen];
char *path_cfg = argv[1];
char *path_out = argv[2];
memset(titleFP,'\0',maxStrLen);
if (argc == 3) { ; } else
{
printf("Usage: t1 cfg_path out_path.\n"); return 1;
}
printf("Configuration folder = [%s]\n", path_cfg);
char *ptr = NULL;
ptr = createPath (titleFP, path_cfg, sep, titleFN);
printf("titleFP = [%s]\n", titleFP);
printf("ptr has [%s]\n", ptr);
return 0;
}
//str.h
#ifndef STR_H
#define STR_H
char *createPath ( char *filePath, char *a, char *b, char *fileName );
#endif
//str.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "const.h"
#include "str.h"
char *createPath ( char *filePath, char *a, char *b, char *fileName )
{
if ( (strlen(filePath) + strlen(a) + strlen(b) + strlen(fileName)) < maxStrLen )
{
strcpy(filePath, a); strcat(filePath, b); strcat(filePath, fileName);
}
else
{
printf("Too long String in fileName [%s]!\n", fileName); return NULL;
}
return filePath;
}
implicit declaration of function ‘createPath’ [-Wimplicit-function-declaration]|
assignment makes pointer from integer without a cast [-Wint-conversion]|
main.c在str.c中没有看到函数,为什么?
答案 0 :(得分:1)
问题是你在main.c中没有#include str.h。
有很多警告可以喷出,但有一个与此问题非常相关(如:)main.c:17:5: warning: assignment makes pointer from integer without a cast
因为您正在使用createPtr,但尚未声明它(因为没有#include&#34; str.h&#34;),它假定createPtr返回一个整数。
但是整数是32位,而我的平台上的指针是64位。这就是为什么指针的高位变坏 - 它们被切断并用垃圾代替。
我添加了原型(通过#include&#34; str.h&#34;),现在它对我有用。