为什么在 C 中使用错误的格式说明符会使我的程序在 Windows 7 上崩溃?

发布于 2024-10-03 03:19:31 字数 346 浏览 4 评论 0 原文

我的程序如下;

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

int main()
{
        char string[] = "Gentlemen start your engines!";
        printf("That string is %s characters long.\r\n", strlen(string));
        return 0;
}

我在 gcc 下编译,虽然它没有给我任何错误,但每次运行它时程序都会崩溃。从我见过的例子来看,代码似乎没问题。很高兴知道我是否做错了什么。

谢谢。

My program is as follows;

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

int main()
{
        char string[] = "Gentlemen start your engines!";
        printf("That string is %s characters long.\r\n", strlen(string));
        return 0;
}

I'm compiling under gcc, and although it doesn't give me any errors the program crashes every time I run it. The code seems to be fine from examples I've seen. It'd be great to know if I'm doing anything wrong.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

沫尐诺 2024-10-10 03:19:31

printf() 中使用不正确的格式说明符会调用未定义的行为。正确的格式说明符应该是 %zu (而不是 %d),因为 strlen() 的返回类型是 size_t

注意:%zu中的长度修饰符z表示与size_t长度相同的整数

Using incorrect format specifier in printf() invokes Undefined Behaviour. Correct format specifier should be %zu (not %d) because the return type of strlen() is size_t

Note: Length modifier z in %zu represents an integer of length same as size_t

奶茶白久 2024-10-10 03:19:31

您的格式说明符错误。 %s 用于字符串,但您传递的是 size_t (strlen(string))。在 printf() 中使用不正确的格式说明符会调用未定义的行为
请改用 %zu,因为 strlen() 的返回类型为 size_t

因此更改

 printf("That string is %s characters long.\r\n", strlen(string));

为:

 printf("That string is %zu characters long.\r\n", strlen(string));

由于您使用的是 gcc,请查看 此处了解可以传递给 printf 的更多信息

You have wrong format specifier. %s is used for strings but you are passing size_t (strlen(string)). Using incorrect format specifier in printf() invokes undefined behaviour.
Use %zu instead because the return type of strlen() is size_t.

So change

 printf("That string is %s characters long.\r\n", strlen(string));

to:

 printf("That string is %zu characters long.\r\n", strlen(string));

Since you are using gcc have a look here for more info what can be passed to printf

就此别过 2024-10-10 03:19:31
 printf("That string is %d characters long.\r\n", strlen(string));

反而:

 printf("That string is %s characters long.\r\n", strlen(string));
 printf("That string is %d characters long.\r\n", strlen(string));

instead:

 printf("That string is %s characters long.\r\n", strlen(string));
柠栀 2024-10-10 03:19:31

你这里有问题
printf("该字符串的长度为 %s 个字符。\r\n", strlen(string));

put

printf("该字符串的长度为 %d 个字符。\r\n" , strlen(字符串));
%d 因为你想打印 str 的长度(strlen 返回数字)

You have a problem here
printf("That string is %s characters long.\r\n", strlen(string));

put

printf("That string is %d characters long.\r\n", strlen(string));
%d because you want to printthe length of str (strlen returns number)

日裸衫吸 2024-10-10 03:19:31

程序崩溃是因为格式化例程尝试访问地址 0x0000001D 处的字符串,该字符串是 strlen() 的结果,其中与字符串完全不同,并且可能根本没有可访问的内存。

Program crashes because formatting routine tries to access a string at address 0x0000001D which is the result of strlen() where is nothing like a string and likely there's no acessible memory at all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文