I read a make_tempory_file demonstration in APUE, and confused about:
char good_template[] = "/tmp/dirXXXXXX"; /* right way */
char *bad_template = "/tmp/dirXXXXXX"; /* wrong way*/
void make_temp(char *template);
int main()
{
char good_template[] = "/tmp/dirXXXXXX"; /* right way */
char *bad_template = "/tmp/dirXXXXXX"; /* wrong way*/
printf("trying to create first temp file...\n");
make_temp(good_template);
printf("trying to create second temp file...\n");
make_temp(bad_template);
exit(0);
}
void make_temp(char *template)
{
int fd;
struct stat sbuf;
if ((fd = mkstemp(template)) < 0)
err_sys("can’t create temp file");
printf("temp name = %s\n", template);
close(fd);
if (stat(template, &sbuf) < 0)
{
if (errno == ENOENT)
printf("file doesn’t exist\n");
else
err_sys("stat failed");
}
else
{
printf("file exists\n");
unlink(template);
}
}
The instruction explain it:
The difference in behavior comes from the way the two template strings are declared. For the first template, the name is allocated on the stack, because we use an array variable. For the second name, however, we use a pointer. In this case, only the memory for the pointer itself resides on the stack; the compiler arranges for the string to be stored in the read-only segment of the executable. When the mkstemp function tries to modify the string, a segmentation fault occurs.
I tried to understand the statement but stuck with stack
Does it refer to the stack where the arrow point to?