gpt4 book ai didi

c程序不会给我错误

转载 作者:行者123 更新时间:2023-12-04 10:37:03 24 4
gpt4 key购买 nike

考虑以下程序

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


typedef struct my_string{
int len;
char *buf;
} my_string_t;


my_string_t *init_my_string(char *);
my_string_t *call_init_my_string();

int main(int argc, char *argv[])
{
my_string_t *st1 = call_init_my_string();

printf("%d\n", st1->len);
printf("%s\n", st1->buf);

free(st1);

return 0;
}


my_string_t *call_init_my_string()
{
my_string_t *st1 = init_my_string("Foo");
return st1;
}


my_string_t *init_my_string(char *s)
{
my_string_t *st = (my_string_t *) malloc(sizeof(*st));
st->len = strlen(s);
st->buf = s;
return st;
}

问题是,
这个程序是否会导致未定义的行为或某种错误?
由于字符串 "Foo"内部函数 call_init_my_string在本地声明
并传递给 init_my_string功能。在 init_my_string功能,我分配
一个空间来保存字符串的大小和字符串本身,但据我所知,这个
分配
my_string_t *st = (my_string_t *) malloc(sizeof(*st));
只为 st->len 分配足够的空间
st->buf指针而不是字符串 "Foo"因为我只分配字符串
st->buf而不是先分配它然后执行以下操作:
 st->buf = (char *) malloc(strlen(s) + 1);
memcpy(st->buf, s, strlen(s));
st->buf[strlen(s)] ='\0';

但是在我编译并运行之后,它没有给我任何错误并且程序运行良好。
为什么这个程序运行良好并且没有给我任何错误?

这是打印在屏幕上的结果:
$ gcc struct_ptr_string1.c -o struct_ptr_string1
$ ./struct_ptr_string1

3
Foo

最佳答案

您的代码中没有未定义的行为。

字符串文字 "Foo"具有静态存储期限。您正在将其地址传递给 init_my_string并简单地存储该地址(本质上是指向 "Foo" 的指针)。

您的代码等效于(除了我们还有一份 "Foo" 的副本):

my_string_t *call_init_my_string()
{
static char s[] = "Foo";
my_string_t *st1 = init_my_string(&s[0]);
return st1;
}

my_string_t *init_my_string(char *s)
{
my_string_t *st = malloc(sizeof(*st));
st->len = strlen(s);
st->buf = s;
return st;
}

关于c程序不会给我错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60126354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com