当前位置: 动力学知识库 > 问答 > 编程问答 >

c++ - Is it valid to append a string to a character array like char p [] = "TEST" using strcat

问题描述:

#include<iostream>

#include<string.h>

using namespace std;

int main()

{

char p [] = "TEST";

strcat (p, "VAL");

cout << p;

return 0;

}

If what I understand is correct, a statement like char p [] = "TEST"; will allocate space from stack. When I call strcat() for such a string how the storage for p[] is adjusted to accommodate extra characters?

Last cout prints "TESTVAL". Is it valid to call strcat like this? If yes, how this works? I might be having problem with my understanding, but feeling like I lost touch. So this could easily be a dumb question. Please shed some light.

网友答案:

The storage is not adjusted, the call is not valid, and the behaviour of the code is undefined.

网友答案:

when you write

char buffer[] = "some literal";

it is expanded to

char buffer[sizeof("some literal")] = "some literal";

which has exact size to store "some literal" and nothing more.

when you concate another string in the end of the current buffer- you write beyond the boundries of the array - having undefined behavior.

another issue that in C++, we usually use std::string to handle strings, which does all the memory adjustment for us automatically.

网友答案:

p reserves space for 5 characters (4 + 1 for the null terminator). You are then appending 3 more characters which needs room for 8 (7 + 1 for the null). You don't have enough room for that and will be overwriting the stack. Depending on your compiler and build settings, you may not see any difference as potentially, the compiler leaves spaces between stack variables. On an optimised release build, you will probably get a crash.

If you change your code to look like this, you should see that sentinel1 & 2 are no longer 0 (it depends on the compiler which one will get trashed).

#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;
}
分享给朋友:
您可能感兴趣的文章:
随机阅读: