Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针所在的堆栈_C - Fatal编程技术网

C 指针所在的堆栈

C 指针所在的堆栈,c,C,我在APUE中读到一个临时文件演示,对以下内容感到困惑: char good_模板[]=“/tmp/dirXXXXXX”/*右路*/ char*bad_template=“/tmp/dirXXXXXX”/*错误的方向*/ void make_temp(字符*模板); int main() { char good_template[]=“/tmp/dirXXXXXX”/*正确的方式*/ char*bad_template=“/tmp/dirXXXXXX”/*错误方式*/ printf(“正在尝试创

我在APUE中读到一个临时文件演示,对以下内容感到困惑:

char good_模板[]=“/tmp/dirXXXXXX”/*右路*/

char*bad_template=“/tmp/dirXXXXXX”/*错误的方向*/

void make_temp(字符*模板);
int main()
{
char good_template[]=“/tmp/dirXXXXXX”/*正确的方式*/
char*bad_template=“/tmp/dirXXXXXX”/*错误方式*/
printf(“正在尝试创建第一个临时文件…\n”);
制作模板(好的模板);
printf(“正在尝试创建第二个临时文件…\n”);
制作临时模板(坏模板);
出口(0);
}
无效生成临时(字符*模板)
{
int-fd;
结构统计sbuf;
如果((fd=mkstemp(模板))<0)
err_sys(“无法创建临时文件”);
printf(“临时名称=%s\n”,模板);
关闭(fd);
如果(统计(模板和sbuf)<0)
{
if(errno==enoint)
printf(“文件不存在\n”);
其他的
系统错误(“统计失败”);
}
其他的
{
printf(“文件存在\n”);
取消链接(模板);
}
}
说明书解释了这一点:

行为上的差异来自于两个模板字符串的声明方式。对于第一个模板,在堆栈上分配名称,因为我们使用数组变量。但是,对于第二个名称,我们使用指针在这种情况下,只有指针本身的内存驻留在堆栈上编译器安排字符串存储在可执行文件的只读段中。当mkstemp函数尝试修改字符串时,会出现分段错误

我试图理解这句话,但还是坚持用
stack

它是否指向箭头指向的堆栈

当mkstemp函数尝试修改字符串时,会出现分段错误

原因是字符串声明为
char*bad_template=“/tmp/dirXXXXXX”
错误的\u模板
分配给字符串文本

C
中,修改字符串文字是未定义的行为

参考-C99标准第6.4.5-6节

字符串文字是包含在字符串中的零个或多个多字节字符的序列 双引号,如“xyz”中的双引号。宽字符串文字相同,但前缀为字母L

如果程序试图修改这样的数组,则行为是未定义的


+1获取一个正确的答案,避免讨论堆栈。“堆栈”不是C语言的概念。相反,它是一个(非常常见的)实现细节。重要的是,无论对象存储的性质或位置如何,都不能修改字符串文本。当然,任何其他元素为非常量的数组,比如OP的
好的模板
,都可能会被修改。所以我应该忘记堆栈,这里使用堆栈对吗@JohnBollinger@A_Pivate-出现分段错误的原因与堆栈无关。您正在修改字符串文字,不应该修改它。@a_Pivate,我不是说没有堆栈。我只是说,这不是思考问题的好方法,也不是真正考虑任何涉及C语言语义的问题。
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);
    }
}