- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试理解 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。由于 a
是 char *
,因此 &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()
中的 a
。 a
是一个指针,在 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/
在我从事的项目(一个 Windows 和 Ubuntu 应用程序)中,我定义了一个与日志库交互的宏。本质上,这个宏接受类似 printf 的输入,转换为字符串,并将其发送到日志库。我附上一个使用 st
我正在尝试使用 snprintf基于我读过的手册的函数是 的一部分header 但是我收到一个错误,它已被隐式声明。这是我的代码: #include #include #include str
当我通过 Fortify 分析器工具之一运行我的代码时,它提示 snprintf 说“格式字符串参数没有正确限制函数可以写入的数据量” 我了解 snprintf 不应导致缓冲区溢出。但仍然是为什么该工
在我的代码中,我使用 snprintf 如下所示,并且能够看到以下行为 char text[30] = {0}; snprintf(text, sizeof(text), "%s", "hello")
我创建了以下程序: #include #include #define TESTER "name=%s " int main(){ char *x; x = malloc(100);
当我通过 Fortify 分析器工具之一运行我的代码时,它提示 snprintf 说“格式字符串参数没有正确限制函数可以写入的数据量” 我了解 snprintf 不应导致缓冲区溢出。但仍然是为什么该工
我收到 format not a string literal and no format arguments当我在 Linux 上编译它时发出警告。 snprintf显示 const char*对于
char symbols[16] = ""; int index = 0; while (1) { if (index % 2) snprintf(symbols, siz
我正在尝试了解 snprintf 并找到了 this answer举个例子: char buf[20] = ""; char *cur = buf, * const end = buf + sizeo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在尝试理解 C 中的 char 指针。基本上我正在做的是声明一个 char* 指针 main 并在另一个函数中通过引用传递并在那里进行修改。现在,我想打印 main 中 char 的值,这给了我段
我正在使用 C 语言(指针、指针-指针等,我喜欢它)做我的第一步,所以如果这是一个愚蠢的问题,请仁慈。 该片段不输出任何内容: char buf[256]; snprintf(buf, sizeof
我需要将一些数字(整数和 double )转换为 std::strings,并且出于性能原因不能使用 stringstream(我们发现它在同时使用时非常慢) 如果能做这样的事情就好了 templat
我已经查看这段代码一段时间了,但似乎找不到我的错误。我想我知道 snprintf(dest, n, fmt, src) 应该如何工作(它在填充 后返回 src 缓冲区中剩余的字符数>dest 缓冲区与
为什么 snprintf 在第二种情况下给出不同的值。是不是因为任何整数限制。您能否解释一下 snprintf 的工作原理以及为什么会出现负值 #include #include main() {
考虑以下代码: char *myContent = "content"; int size = snprintf(NULL, 0, "INSERT INTO myTable (col1) VALUES
我正在编写自己的 ncurses 库,突然发现在 GDB 中 snprintf() 返回的长度大于我指定的长度。这是定义的行为还是我的一些错误? (可重现的)片段代码是这样的: niko: snipp
我写了一个简单的小程序来使用 snprintf 读取具有以下格式的文件, skip first 15 chars , next 9 chars are sequence number, next 2
我使用snprintf 将格式化的数据写入磁盘,但我有一个问题,如何将它保存到用户的主目录? snprintf(filename, sizeof(filename), "%s_%s.sho", cl
定义: CHAR_BACKSLASH 定义为 '\\' 或 0x5C 变量: workingDir 是一个 C 字符串 myFilePath 是一个 C 字符串 int len = strlen(wo
我是一名优秀的程序员,十分优秀!