打印功能变量时,打印输出有所不同

时间:2019-10-14 19:53:39

标签: c strcpy strncpy

我尝试解决一个练习,其中我们必须返回一个结构,该结构包含第一个用空格分隔的单词及其给定字符串的长度。示例:“测试字符串”返回{“ Test”,4}。

为解决此问题,我实现了以下功能:

struct string whitespace(char* s){
    char* t = s;
    size_t len = 0;
    while(*t != ' '){
        len++;
        t++;
    }
    char out[len+1];
    strncpy(out, s, len);
    if(len>0){
        out[len] = '\0';
    }
    //printf("%d\n",len);
    struct string x = {out, len};
    return x;
}

,其结构定义如下:

struct string{
    char* str;
    size_t len;
};

如果我运行以下主要功能:

int main(){
    char* s = "Test string";
    struct string x = whitespace(s);
    printf("(%s, %d)\n", x.str, x.len);
    return 0;
}

我得到以下输出:

(, 4)

删除评论//printf("%d\n",len);的地方会得到:

4
(Test, 4)

实际上,每当我在函数(Test, 4)中打印出给定变量时,就会输出字符串whitespace(char* s)。同样,当使用诸如gcc-O3之类的不同-Ofast优化标志时,即使没有在函数中打印变量,结果也是正确的。

我遇到了某种不确定的行为吗?有人可以解释这里发生了什么吗?

1 个答案:

答案 0 :(得分:2)

您要返回的结构包含一个char *,您将其指向局部变量out。函数返回时,该变量超出范围,因此取消引用该指针将调用undefined behavior

不要使用VLA,而是声明out作为指针并为其分配内存。然后,您可以安全地将struct成员设置为该地址,并且在程序运行期间内存将是可用的。

char *out = malloc(len+1);

另外,在退出程序之前,请确保先free保留此内存。

相关问题