【问题标题】:char * disappears if I don't print it?如果我不打印,char * 会消失吗?
【发布时间】:2015-07-24 22:34:39
【问题描述】:

我有一个非常奇怪的问题。我基本上有一个接收char* 的函数,它拆分字符串并返回子字符串。我的问题是如果我打印 char* THEN 的长度然后返回它,那么值仍然存在,但如果我不调用函数来获取长度,那么当它从函数中出来时它就会消失。

我可能在上面解释得很糟糕,所以我将复制并粘贴下面的代码片段:

void processFile (char *currentLine, int currentLineNumber)
{
    int     type;

    char    *accountName, *secCodeRef, *secCode = NULL, *reference = NULL;

    if ((type = getType(currentLine)) == TYPE_HEADER)
    {
        accountName = strtok (currentLine, " "); //Remove "Type"

        accountName = strtok (NULL, " ");   //Get Account Name
        secCodeRef = strtok (NULL, " ");    //get Security code and reference
        secCode = getSecCode(secCodeRef, secCode); //Get Security Code
        printf("TEST:%s\n", secCode);

    }

基本上secCodeRef 是一个包含安全代码和参考(例如)GB0007980592REFERENCE1 的字符串。前 11 个字符是安全码,其余是参考。所以我把这个字符串传递给一个叫做getSecCode的函数:(SECCODELENGTH是13 btw)

char *getSecCode (char *secCodeRef, char *secCode)
{
    char        SecCode[SECCODELENGTH];
    char        *SecuCode = (char*)&SecCode;

    memcpy(SecCode, &secCodeRef[START], SECCODELENGTH-1);

    SecCode[SECCODELENGTH-1] = '\0';

    printf("%d\n", getStringLength(SecuCode));

    return SecuCode;

}

当这行运行时,它会提取SecuCode ok:

printf(%d\n, getStringLength(SecuCode));

结果是:(我正在从包含不同数据的文件中读取)

12
TEST:GB0007980592
12
TEST:GB0007980593
12
TEST:GB0007980594

哪个是正确的

但是当我注释掉时:

//printf(%d\n, getStringLength(SecuCode));

输出是:

TEST:
TEST:
TEST:

为什么 print 语句会影响返回值?

【问题讨论】:

  • 请避免使用许多相同的名称。这非常令人困惑。并使用char *SecuCode = (char*)&SecCode; 而不是char *SecuCode = SecCode;。但这并不能解决您的问题。
  • 我没有按照你说的去做。不过感谢您的命名建议。
  • 请不要把char写成Char。它们是两个不同的标识符。 (我已经编辑了你的问题。)
  • @KeithThompson 抱歉,我没有意识到它们是不同的。我只真正了解 C 和(在较小程度上)Java。
  • C 和 Java 都区分大小写。

标签: c string return


【解决方案1】:
 char        SecCode[SECCODELENGTH];
 char        *SecuCode = (char*)&SecCode;

SecCode 是函数 getSecCode() 的本地数组,您返回此本地数组的地址,这将导致未定义的行为。

【讨论】:

  • 啊,是的,我明白了,我将把 SecCode[SECCODELENGTH] 移到第一个函数,看看会发生什么。如果我调用 print 语句,为什么它会起作用?
  • @NazHaque 当您的代码中有未定义的行为时,任何事情都可能发生。幸运的是,它有时有效,有时无效;t
  • 非常感谢Gopi,要不是你指出,我永远也看不到它。
  • @NazHaque 没有问题.. :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
相关资源
最近更新 更多