指针地址和分段错误

时间:2015-12-12 16:37:40

标签: c function pointers segmentation-fault return-value

该函数返回指向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中没有看到函数,为什么?

1 个答案:

答案 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;),现在它对我有用。