【发布时间】:2010-11-26 04:53:06
【问题描述】:
我从来没有真正做过很多 C 但我开始玩弄它。我正在写一个像下面这样的小sn-ps,试图理解C中关键构造/函数的用法和行为。下面我写的一个试图理解char* string和char string[]之间的区别以及然后长度字符串工作。此外,我想看看sprintf 是否可用于连接两个字符串并将其设置为第三个字符串。
我发现,我用来存储其他两个连接的第三个字符串必须使用char string[] 语法设置,否则二进制文件将使用SIGSEGV (Address boundary error) 死掉。使用数组语法设置它需要一个大小,所以我最初将它设置为其他两个字符串的组合大小。这似乎让我可以很好地执行连接。
不过,出于好奇,我尝试将“连接”字符串扩展为比我分配的大小更长。令我惊讶的是,它仍然有效,并且字符串大小增加了,可以printf'd 罚款。
我的问题是:为什么会发生这种情况,它是无效的还是有风险/缺点?此外,为什么char str3[length3] 有效但char str3[7] 在sprintf 行尝试执行时导致“SIGABRT (Abort)”?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
char* str1 = "Sup";
char* str2 = "Dood";
int length1 = strlen(str1);
int length2 = strlen(str2);
int length3 = length1 + length2;
char str3[length3];
//char str3[7];
printf("%s (length %d)\n", str1, length1); // Sup (length 3)
printf("%s (length %d)\n", str2, length2); // Dood (length 4)
printf("total length: %d\n", length3); // total length: 7
printf("str3 length: %d\n", (int)strlen(str3)); // str3 length: 6
sprintf(str3, "%s<-------------------->%s", str1, str2);
printf("%s\n", str3); // Sup<-------------------->Dood
printf("str3 length after sprintf: %d\n", // str3 length after sprintf: 29
(int)strlen(str3));
}
【问题讨论】: