开发者

Sprintf Segmentation Fault

开发者 https://www.devze.com 2023-03-30 07:18 出处:网络
numCheck is number between 1-1000.This code gives me a segfault only when I collect the results of sprintf in c开发者_JAVA百科harcheck. If I simply use sprintf without using the results, I don\'t get

numCheck is number between 1-1000. This code gives me a segfault only when I collect the results of sprintf in c开发者_JAVA百科harcheck. If I simply use sprintf without using the results, I don't get a seg fault. What's happening here?

char * numString;
int charcheck = sprintf(numString, "%d", numCheck);


You need to provide your own memory for sprintf. Also, don't use sprintf, but rather snprintf:

char buf[1000] = {0};

snprintf(buf, 999, ....);

Alternatively you can allocate memory dynamically:

char * buf = new char[BUFSIZE];
snprintf(buf, BUFSIZE-1, ...);
/* ... */
delete[] buf;


The pointer given as the first parameter to sprintf is expected to point to a memory location where sprintf should write the formatted string.

In this case you didn't initialize numString to point to some memory you allocated for the formatted string. Since numString isn't initialized it might point anywhere, and in your case trying to write the formatted output to that location results in a segmentation fault.


The first argument to sprintf must point to a valid buffer. You have a char* but it points to garbage.

Change your code to:

char numString[80] = { };
int charcheck = sprintf(numString, "%d", numCheck);

So that numString actually points to a valid buffer (of 80 characters in this example, all elements of which are initialised to 0).

It would also be good to use snprintf so you can pass the size of your buffer to it, which will help prevent buffer overflows:

const int bufsize = 80;
char numString[bufsize] = { };
int charcheck = snprintf(numString, bufsize - 1, "%d", numCheck);

Notice that you subtract one from the buffer size that you pass to snprintf because you don't want it to use the very last slot, which you want to make sure is NULL to denote the end of the string.


You need to allocate space for the result such as

char numString[50];
int charcheck = sprintf(numString, "%d", numCheck);

In your case the interal workings of sprintf are trying to reference NULL which is the default value for a pointer in your case.


The most straightforward thing to do is to use an array as above, e.g.,

char numString[80] = { };

suggested by Seth, Jesus and Kerrek.

I think the last answer from sth is a good explanation: "the first parameter to sprintf is expected to point to a memory location where sprintf should write the formatted string." So apart from using an array of characters, which would force the allocation of memory for the string, you can also use this:

char *numstring = (char*) malloc(80);

This should let you explicitly free the allocated memory when it is no longer needed.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号