gpt4 book ai didi

c - 在 C 中,动态分配的字符串文字的间接操作是如何真正工作的?

转载 作者:行者123 更新时间:2023-11-30 18:33:36 25 4
gpt4 key购买 nike

就目前情况而言,我知道动态分配的字符串文字在运行时不能更改,否则会遇到段错误。

这是因为,从我在汇编代码中看到的来看,动态分配的字符串文字存储在 .rodata 段中,将这些文字放置在我解释为只读内存的位置。

所以从理论上讲,这永远不会像我希望的每个现代 C 编译器那样起作用:

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

int
main( void )
{
char *p = ( char * )malloc( 10 * sizeof( char ) );
if ( p == NULL )
{
puts( "Bad memory allocation error!" );
return( EXIT_FAILURE );
}
else
{
p = "literal";
printf( "%s\n", p );
p[0] = 't'; // <-- This should cause a segmentation fault!
printf( "%s\n", p ); // <-- This should never reach execution!
}
return( EXIT_SUCCESS );
}

但是,在研究了 tolower()toupper() 的工作原理后。我发现很难理解这两个简单的函数如何能够完成我长期以来认为不可能的事情。这就是我的意思:

#include <stdio.h>

int
tolowercase( int c )
{
return ( c >= 'A' && c <= 'Z' ) ? ( c + 32) : ( c );
}

int
retstrlen( char *str )
{
int len = 0;
while( *str != '\0' ) { len++; str++; }
return( len );
}

int
main( int argc, char **argv )
{
for( int i = 0; i < argc; i++ )
{
for( int j = 0; j < retstrlen( argv[i] ); j++ )
{
argv[i][j] = tolowercase( argv[i][j] );
printf( "%c", argv[i][j] );
}
printf( "\n" );
}
return 0;
}

我的自定义 tolower() 函数中定义的源代码如何不会像通常通过操作动态分配的字符串文字那样导致段错误?

我可以得出的唯一假设是,由于 tolowercase() 具有 int 参数和 int 返回类型,因此编译器会执行间接操作 **argv 的类型转换。

我很确定我在这方面的方向是正确的,但我可能在这里弄错了我的整个术语,那么 **argv 到底发生了什么?

最佳答案

两点:

  1. p[0] = 't'; // <-- This should cause a segmentation fault!不保证,唯一保证的是调用 undefined behavior .

    对于字符串文字,来自 C11 ,第 §6.4.5 章

    [...] If the program attempts to modify such an array, the behavior is undefined.

  2. 关于“我的自定义 tolower() 函数中定义的源代码如何不会像通常通过操作动态分配的字符串文字那样导致段错误?”

    引用C11 ,第 §5.1.2.2.1 章

    The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.

    所以,它们不是字符串文字,它们是完全可以修改的。

关于c - 在 C 中,动态分配的字符串文字的间接操作是如何真正工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56311229/

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