char * ,strcat 交互 .为什么它不打印任何东西



它什么也不打印。我认为问题出在类型 char * 上,但我不知道是否以及为什么。

int main() {
char *a = "0123456789" ;
char *b = "abcdefghij" ;
strcat (a,b) ;
printf( "%s", a ) ;
}

strcat修改destination参数缓冲区,但a的缓冲区位于只读内存中,因为它是字符串文本。

解决方案是在运行时创建一个缓冲区并将其用作缓冲区。当然,您需要先将a复制到其中。

char* a = "1234567890";
char* b = "abcdefghij";
size_t aLen = strlen( a );
char* combined = malloc( sizeof(char) * ( strlen(a) + strlen(b) + 1 ) );
strcpy_s( combined, aLen, a ); // always use _s versions of string/buffer functions!
strcat( combined, b );
puts( combined );
free( combined );

或者,在 C99 中,我们可以只使用预先初始化(并预分配以足够大的堆栈分配数组(。堆栈数组(包括预初始化的堆栈数组(可以将其缓冲区写入:

char a[100] = "1234567890";
strcat( a, "abcdefghij" );
puts( a );

你不能把字符串文字作为 dest。 使用数组作为目标缓冲区

char str[30] = "Ala ";
const char *strFrom = "ma kota";
strcat (str, strFrom);

编辑:扩展答案

看看字符串文字是如何编译的: https://godbolt.org/g/hZuR1o

数组缓冲区是内联定义的,其值在执行期间构造并位于堆栈上。因此,缓冲区本身可以自由修改。

如果你动态分配它(使用 malloc 或 calloc(,你会得到一个指向堆上的缓冲区的指针,该缓冲区也可以修改。

另一方面,字符串文本位于只读内存区域中,并在各种实例之间共享,因为它们无论如何都是只读的。这就是它的设计方式,伙计:(

最新更新