c - 打印函数变量时打印输出不同

标签 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)

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

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

最佳答案

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

与其使用 VLA,不如将 out 声明为指针并为其分配内存以指向。然后您可以安全地将结构成员设置为该地址,内存将在程序运行期间保持良好状态。

char *out = malloc(len+1);

此外,请务必在退出程序之前释放此内存。

关于c - 打印函数变量时打印输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58383251/

相关文章:

C strncpy 2 字符

c - C语言编程求对称数

c - 如何避免管道破裂?

C - strcpy 的一般使用

c - 在 C 中使用字符串进行升序插入排序时遇到问题

c - 访问冲突 strcpy

c - calloc char 数组与 null 终止符之间的关系

c - gcc4.2.1 无法解释的错误 (Segm.fault 11)

c - 具有相同数据的两个 C void 指针是否是不同的内存对象?

c - 比较后变量为空