gpt4 book ai didi

c++ - snprintf 段错误

转载 作者:行者123 更新时间:2023-11-30 18:25:18 25 4
gpt4 key购买 nike

我正在尝试理解 C 中的 char 指针。基本上我正在做的是声明一个 char* 指针 main 并在另一个函数中通过引用传递并在那里进行修改。现在,我想打印 main 中 char 的值,这给了我段错误。但是如果我打印被调用函数中的值,它打印得很好。

此外,当我尝试对 main 中的 char 指针执行 snprintf 时,我再次遇到段错误,但在被调用的函数中却没有出现段错误。

我搜索并尝试理解字符和指针,但无法调试它。

下面是带注释的代码:

#include<stdio.h>



int main(void)
{
char *a;
int ret;
/* Below line gives Segmentation Fault. */
// snprintf(a,10,"%s","Hello");
/* Below line prints '(null)'.OK */
printf("Before Function Call: %s\n",a);
ret = func(&a);
/* Below line prints count of characters returned from func .OK */
printf("Characters written : %d\n",ret);
/* Below line gives Segmentation Fault. */
printf("After Function Call: %s\n",a);
return 1;
}

int func(char *b)
{
int ret = 0;
/* Below line prints blank. Why? Above it prints '(null)'*/
printf(" In func-> Before operation: %s\n",b);
ret = snprintf(b,10,"%s",", World");
/* Below line prints ' World'. OK */
printf(" In func-> After operation: %s\n",b);
return ret;
}

最佳答案

让我们逐行浏览一下这些函数。

char *a;

在这里你声明了一个迄今为止指向任何地方的指针。

/* Below line gives Segmentation Fault. */
// snprintf(a,10,"%s","Hello");

当然可以。由于 a 指向“无处”或“任何地方”,这是未定义的行为。您应该首先通过一种或其他方式分配内存,并让 a 指向那里。然后您就可以按照您的描述使用它。

ret = func(&a);

在这里,您将a地址传递给func() - 这是可以的。

/* Below line gives Segmentation Fault. */
printf("After Function Call: %s\n",a);

a 已更改,不再像上面那样是空指针,而是指向无法读取任何内容的目的地。再次出现未定义的行为。

return 1;

这意味着失败。最好返回 0,因为这意味着成功。

int func(char *b)

停下来。上面您将 &a 传递给了 func。由于 achar *,因此 &a 将是 char **。 B 但 func 接受 char *。因此存在差异,从而导致错误。

/* Below line prints blank. Why? Above it prints '(null)'*/
printf(" In func-> Before operation: %s\n",b);

因为上面打印了 a,但是这里打印了 b,即 &a

ret = snprintf(b,10,"%s",", World");

在这里,您在 b 指向的位置写入一些内容,即 main() 中的 aa 是一个指针,在 32 位系统上大小为 4,在 64 位系统上大小为 8。并且不应该被滥用于存储字符串。

printf("    In func-> After operation: %s\n",b);

这是偶然的;您再次出现未定义的行为,并且可能会干扰调用者的堆栈框架。

让我们稍微改进一下您的代码:

// prototype - make the function known to main() so that the right calling convention is used
int func(char *b);

int main(void)
{
char *a = malloc(100); // should be adjusted depending on the needs...
int ret;
/* Below line no longer gives Segmentation Fault now. */
snprintf(a,10,"%s","Hello");
printf("Before Function Call: %s\n",a);
ret = func(a);
/* Below line prints count of characters returned from func .OK */
printf("Characters written : %d\n",ret);
printf("After Function Call: %s\n",a);
free(a); // as we alloc'ed it...
return 0; // as we didn't notice anything going wrong...
}

int func(char *b)
{
int ret;
printf(" In func-> Before operation: %s\n",b);
// Here is the qustion: do we want to append or to overwrite?
char * b_append = b + strlen(b);
ret = snprintf(b_append,10,"%s",", World");
printf(" In func-> After operation: %s\n",b);
printf(" In func-> We appended %s\n",b_append);
return ret;
}

关于c++ - snprintf 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31593051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com