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



我尝试解决一个练习,其中我们必须返回一个结构,该结构包含给定字符串的第一个空格分隔单词及其长度。示例:"测试字符串"返回{"测试",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] = '';
}
//printf("%dn",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("%dn",len);时,我得到:

4
(Test, 4)

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

我是不是遇到了某种不明确的行为?有人能解释一下这里发生了什么吗?

返回的结构包含一个char *,它指向局部变量out。当函数返回时,该变量超出了作用域,因此取消引用该指针会调用未定义的行为。

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

char *out = malloc(len+1);

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

相关内容

  • 没有找到相关文章

最新更新