gpt4 book ai didi

c - 无论 malloc 大小如何,strcpy 都能正常工作吗?

转载 作者:行者123 更新时间:2023-12-04 19:59:39 25 4
gpt4 key购买 nike

我目前正在学习 C 编程,因为我是一名 Python 程序员,所以我并不完全了解 C 的内部工作原理。我只是偶然发现了一件非常奇怪的事情。

void test_realloc(){
// So this is the original place allocated for my string
char * curr_token = malloc(2*sizeof(char));

// This is really weird because I only allocated 2x char size in bytes
strcpy(curr_token, "Davi");
curr_token[4] = 'd';
// I guess is somehow overwrote data outside the allocated memory?
// I was hoping this would result in an exception ( I guess not? )

printf("Current token > %s\n", curr_token);

// Looks like it's still printable, wtf???
char *new_token = realloc(curr_token, 6);
curr_token = new_token;
printf("Current token > %s\n", curr_token);
}


int main(){
test_realloc();
return 0;
}

所以问题是:我怎么能在字符串中写入比其分配的大小更多的字符?我知道我应该自己处理分配的内存,但这是否意味着当我在指定内存之外写入时没有任何迹象表明出现问题?

我试图完成的事情

  1. 分配一个 4 个字符(+ 空字符)的字符串,我将在其中写下我名字的 4 个字符
  2. 重新分配内存以容纳我名字的最后一个字符

最佳答案

know I'm supposed to handle mallocated memory myself but does it mean there is no indication that something is wrong when I write outside the designated memory?

欢迎使用 C 编程 :)。总的来说,这是正确的:您可能会做错事,但不会立即收到反馈。事实上,在某些情况下,您可能会做错一些事情,并且永远在运行时看不到问题。但是,在其他情况下,您会看到崩溃或其他对您来说没有意义的行为。

关键术语是未定义的行为。如果您继续使用 C 语言编程,您应该熟悉这个概念。它的意思就像听起来一样:如果您的程序违反了某些规则,则行为未定义 - 它可能会做您想要的,它可能会崩溃,它可能会做一些不同的事情。更糟糕的是,它可能大部分时间 都按照您的意愿行事,但只是偶尔做一些不同的事情。

正是这种机制让 C 程序变得更快——因为它们在运行时不会做很多你可能习惯于从 Python 进行的检查——但它也使 C 变得危险。很容易写出错误的代码而自己却没有意识到;然后稍后在其他地方进行细微的更改,或者使用不同的编译器或操作系统,代码将不再按您想要的方式运行。在某些情况下,这可能会导致安全漏洞,因为不需要的行为可能会被利用。

关于c - 无论 malloc 大小如何,strcpy 都能正常工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43471724/

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