Rob*_*b U 3 c string ram pointers toupper
我用 C 写了一个函数,用指针将所有小写字母转换成大写字母。它看起来像下面这样:
char *ft_strupcase(char *str)
{
char *str_begin;
str_begin = str;
while (*str != '\0')
{
if (*str >= 'a' && *str <= 'z')
{
*str = *str - 32;
}
str++;
}
return (str_begin);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用以下主要功能进行测试,则会出现总线错误:
#include "ft_strupcase.c"
int main(void)
{
printf("The string \"I am your father\" is now %s\n", ft_strupcase("I am your father"));
return (0);
}
Run Code Online (Sandbox Code Playgroud)
错误消息如下所示:
/bin/sh: line 1: 79346 Bus error: 10
Run Code Online (Sandbox Code Playgroud)
但是如果我创建一个字符串变量来存储字符串,则没有总线错误。例如,如果我使用以下主要功能对其进行测试:
#include "ft_strupcase.c"
int main(void)
{
char test_string[50] = "I am your father";
printf("The string \"I am your father\" is now %s\n", ft_strupcase(test_string));
return (0);
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,输出为:
The string "I am your father" is now I AM YOUR FATHER
Run Code Online (Sandbox Code Playgroud)
我真的不明白第一个测试与第二个测试有何不同。谁能向我解释为什么会发生这种情况?
C 标准规定字符串文字是只读的。在许多情况下,它们实际上存储在内存的只读部分中。
当您尝试修改字符串文字时,您会调用undefined behavior,在这种情况下会导致程序崩溃。
相反,您在第二个示例中传递的数组是可写的,因此程序运行成功。
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |