#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char p [] = "TEST";
strcat (p, "VAL");
cout << p;
return 0;
}
如果我理解的是正确的,那么像char p [] =“TEST”这样的陈述;将从堆栈中分配空间。当我为这样的字符串调用strcat()时如何调整p []的存储以容纳额外的字符?
最后一个cout打印“TESTVAL”。这样调用strcat是否有效?如果是,这是如何工作的?我的理解可能有问题,但感觉我失去了联系。所以这很容易成为一个愚蠢的问题。请详细说明。
答案 0 :(得分:8)
未调整存储空间,调用无效,并且代码的行为未定义。
答案 1 :(得分:3)
当你写
protected void btn_redeem_Click(object sender, EventArgs e)
{
int lol = int.Parse(lbl_TotalPrice.Text,System.Globalization.NumberStyles.Currency);
double nprice = lol * 0.05;
int newpoints=0 ;
if (int.Parse(Session["points"].ToString()) >= 1000)
{
double redeem = lol - nprice;
lbl_TotalPrice.Text = redeem.ToString("C");
newpoints = int.Parse(Session["points"].ToString()) - 1000;
}
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HealthDBContext"].ConnectionString);
conn.Open();
string queryStr = "UPDATE Users SET Points ='" + newpoints + "'WHERE UserName=" + Session["New"].ToString();
SqlCommand com = new SqlCommand(queryStr, conn);
conn.Close();
}
它扩展到
char buffer[] = "some literal";
具有存储char buffer[sizeof("some literal")] = "some literal";
的确切大小,仅此而已。
当你在当前缓冲区的末尾连接另一个字符串时 - 你写超出数组的边界 - 具有未定义的行为。
另一个问题在C ++中,我们通常使用"some literal"
来处理字符串,它会自动为我们调整所有内存。
答案 2 :(得分:2)
p保留5个字符的空间(空终止符为4 + 1)。然后你再添加3个字符,需要8个空格(null为7 + 1)。你没有足够的空间,并将覆盖堆栈。根据您的编译器和构建设置,您可能看不到任何差异,编译器在堆栈变量之间留下空格。在优化的发布版本中,您可能会遇到崩溃。
如果您将代码更改为如此,则应该看到sentinel1&amp; 2不再是0(这取决于编译器哪个将被删除)。
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int sentinel1 = 0;
char p [] = "TEST";
int sentinel2 = 0;
strcat (p, "VAL");
cout << p << sentinel1 << sentinel2;
return 0;
}