c strcat 操作中的分段错误
Segmentation fault in c strcat operation
此代码示例有什么问题?我遇到分段错误,或者程序无限地继续 运行。
const char* prefix = "gender_";
char sex[8];
int id;
for(id=0; id <= 9 id++)
{
sprintf(id_string, "%i", id); //converts int id to string id
strcpy(sex, prefix);
strcat(sex, id)
}
//sex 应该是这样的:gender_1, gender_2, gender_3 ... gender_9
您溢出了缓冲区。您忘记了字符串有一个空终止符。
与其编写这样极有可能被利用的脆弱代码,不如:
char sex[9];
snprintf(sex, sizeof sex, "%s%i", prefix, id);
使用snprintf
,即使缓冲区大小错误,至少不会造成缓冲区溢出。当然它仍然可能是一个错误,所以你真的必须注意你的缓冲区大小。
一个选择是用你想要的尺寸来声明性别,而不是一个神奇的数字:
char sex[sizeof "gender_0"];
或
char sex[strlen(prefix) + 1 + 1]; // 1 for the digit, 1 for the terminator
sizeof
字符串文字包含空终止符。
此代码示例有什么问题?我遇到分段错误,或者程序无限地继续 运行。
const char* prefix = "gender_";
char sex[8];
int id;
for(id=0; id <= 9 id++)
{
sprintf(id_string, "%i", id); //converts int id to string id
strcpy(sex, prefix);
strcat(sex, id)
}
//sex 应该是这样的:gender_1, gender_2, gender_3 ... gender_9
您溢出了缓冲区。您忘记了字符串有一个空终止符。
与其编写这样极有可能被利用的脆弱代码,不如:
char sex[9];
snprintf(sex, sizeof sex, "%s%i", prefix, id);
使用snprintf
,即使缓冲区大小错误,至少不会造成缓冲区溢出。当然它仍然可能是一个错误,所以你真的必须注意你的缓冲区大小。
一个选择是用你想要的尺寸来声明性别,而不是一个神奇的数字:
char sex[sizeof "gender_0"];
或
char sex[strlen(prefix) + 1 + 1]; // 1 for the digit, 1 for the terminator
sizeof
字符串文字包含空终止符。