繁体   English   中英

C函数不返回字符串

[英]C function doesn't return a string

为什么此代码不返回预期的串联字符串,而是2?

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

const char * meh() {
    char meh1[32] = "This ";
    char meh2[32] = "should work :)";
    return strcat(meh1, meh2);
}

int main() {
    printf(meh());
    return 0;
}

因为一旦离开函数meh,meh1就会超出范围,并且它在堆栈中占据的区域将用于printf内的其他内容。

strcat通过添加字符串meh1来修改字符串meh2 ,然后返回指向第一个字符串的指针。 在函数中声明了字符串meh1 ,因此指针在函数外部无效。 这就是为什么您得不到期望的结果的原因。 相反,您可以执行以下操作:

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

void meh(char * meh1) {
    char meh2[32] = "should work :)";
    strcat(meh1, meh2);
    return;
}

int main() {
    char meh1[32] = "This ";
    meh(meh1);
    puts(meh1);
    return 0;
}

这将得到预期的结果。 之所以meh1是因为字符串meh1main声明,然后传递给要修改的函数。 这意味着在调用meh之后,修改后的字符串仍可在main

由于strcat()写入其第一个参数,因此实际上您返回了指向meh1 (第一个元素)的meh1 meh1meh2是具有自动存储持续时间的变量。 一旦周围的函数返回,这些变量将被销毁。 访问它们会产生未定义的行为(通常是崩溃)。

您可以执行以下操作:

const char *meh(void)
{
    char meh1[32] = "This ";
    char meh2[32] = "should work :)";

    char *result;
    size_t meh1_len, meh2_len;

    /* figure out how long meh1 and meh2 are */
    meh1_len = strlen(meh1), meh2_len = strlen(meh2);

    /* make a new string with enough space */
    result = malloc(meh1_len + meh2_len + 1);
    if (result == NULL)
        perror("Cannot malloc");

    /* Copy the strings */
    memcpy(result, meh1, meh1_len);
    memcpy(result + meh1_len, meh2, meh2_len + 1);

    return (result);
}

一旦您不再需要meh()的结果,别忘了调用free()

strcat()的手册页中,

char *strcat(char *dest, const char *src);   

strcat()和函数返回指向结果字符串dest的指针。

根据您的用法, destchar meh1[32]的基地址,它是meh()本地地址。 一旦控件从meh()返回, meh1就会超出范围。 因此, printf()的结果不确定[未定义的行为]。

要使其工作,请为meh1使用指针和动态内存分配。

例如,

char *meh1 = NULL;
meh1 = malloc(32);
strcpy(meh1, "this");

和其余的现有meh()

可以根据您的要求返回动态分配的指针。 main()的末尾,您需要free()返回的指针,以避免内存泄漏。

另外,您需要像这样使用printf()

 printf("%s\n", meh());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM