打印函数变量时打印输出不同
Printed output differs when printing variables of function
我尝试解决一个练习,在该练习中我们必须 return 一个结构,其中包含第一个以空格分隔的单词及其给定字符串的长度。示例:"Test string" returns {"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] = '[=10=]';
}
//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
。当函数 returns 时,该变量超出范围,因此取消引用该指针会调用 undefined behavior.
与其使用 VLA,不如将 out
声明为指针并为其分配内存以指向。然后您可以安全地将结构成员设置为该地址,内存将在程序运行期间保持良好状态。
char *out = malloc(len+1);
另外,在退出你的程序之前一定要free
这段记忆。
我尝试解决一个练习,在该练习中我们必须 return 一个结构,其中包含第一个以空格分隔的单词及其给定字符串的长度。示例:"Test string" returns {"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] = '[=10=]';
}
//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
。当函数 returns 时,该变量超出范围,因此取消引用该指针会调用 undefined behavior.
与其使用 VLA,不如将 out
声明为指针并为其分配内存以指向。然后您可以安全地将结构成员设置为该地址,内存将在程序运行期间保持良好状态。
char *out = malloc(len+1);
另外,在退出你的程序之前一定要free
这段记忆。