gpt4 book ai didi

c - sprintf() 将字符串打印到 (m) 分配的数组,尽管它应该很小

转载 作者:太空宇宙 更新时间:2023-11-04 05:53:29 25 4
gpt4 key购买 nike

我已经在包括 stackoverflow 在内的网络上搜索了几个小时,但没有找到适合我的问题的任何答案 - 也许是因为它不是一个真正的问题,因为程序可以运行......但它不应该。听起来很奇怪?它是 - 至少对我而言。

这是大学任务的一部分。任务是为 char 数组分配内存,然后使用 sprintf() 将字符串打印到数组,最后使用 printf() 打印数组。对于内存分配,将使用 malloc()(我知道有更好的方法,但我们必须完全使用这些函数)。

这就是我所拥有的:

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

int main()
{
// Declare char array
char *string;

/* Allocate memory for string of certain length
The 1 is only to show what's wrong. I'm aware of the actual size needed */
if( (string = malloc( 1 * sizeof(char) ) ) == NULL )
{
perror("malloc failed to allocate n chars!");
exit(1);
}

/* Print string to previously allocated memory. Now I would expect an error due to too few bytes allocated */
sprintf(string, "Too many characters here...");

// Print string to command line
printf("%s\n", string);

return 0;
}

到目前为止它是有效的:它在没有任何通知的情况下使用 gcc -Wall -std=c99 在 Ubuntu 和 Mac OSX 上编译。

但是

问题是它不应该。您可能已经注意到,我为要写入数组的字符串分配了几个字节。它仍然有效,无论字符串有多长(最多尝试 1000 个字符)或我分配了多少字节。不会关心它,如果大学的自动测试单元不会将其标记为错误。它说程序没有从分配的数组中读取。这就是为什么我假设 sprintf 将字符串放在分配的数组中以外的任何地方。但我无法解释这怎么可能。

如果你们知道我做错了什么,我将不胜感激。

提前致谢!

------ 更新 ------

正如 Mike 所指出的,我没有在此代码段中使用 free(string)(感谢提示!)。在实际程序中,我在 printf() 之后放置了 free(string)。但是,当我再次尝试在该语句之后打印字符串时 -> 它打印时就好像什么都没发生一样!这怎么可能?

最佳答案

问题在于断言“问题在于它不应该”。或“预计会出现错误”。

/* Now I would expect an error due to too few bytes allocated */
sprintf(string, "Too many characters here...");

当代码做一些不应该做的事情时,比如写超出分配的内存空间,C 没有定义应该发生什么。因此它是未定义的行为 (UB)。预期错误需要 C 部分定义的行为。

UB 意味着任何事情都可能发生。代码不需要检查和提示尝试访问外部分配的内存。

C 为您提供了大量的绳索代码来快速完成各种事情
- 包括足够的绳索让代码自行悬挂。


鉴于 sprintf() 容易写出越界,代码可以使用 snprintf() 并检查其结果。 snprintf() 不会覆盖缓冲区的给定 size

char *string;
size_t size = 1; // or whatever
string = malloc(size);
...
int n = snprintf(string, size, "Too many characters here...");
if (n < 0 || n >= size) return Error_code;
...
printf("%s\n", string);

关于c - sprintf() 将字符串打印到 (m) 分配的数组,尽管它应该很小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33288621/

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