【问题标题】:Segfault when trying to printf large char[]尝试打印大字符 [] 时出现段错误
【发布时间】:2013-01-22 10:05:08
【问题描述】:

以下代码对我有段错误。

#include <stdio.h>

int main(int argc, char **argv)
{
    const int MEMSIZE = 1024*1024*10;
    char memblock[MEMSIZE];
    memblock[10] = '\0';

    printf("%s", memblock);

    return 0;
}

字符数组有大小限制吗?我忘记了我所有的C,我在这里做了什么愚蠢的事情吗?

【问题讨论】:

  • 巧合的是,这是堆栈溢出(或下溢)的情况。

标签: c segmentation-fault printf


【解决方案1】:

用这个小程序发现你的最大堆栈大小,并检查你的数组是否更大

#include <stdio.h>
#include <sys/resource.h>

int main ()
{
    struct rlimit rl;
    int result = getrlimit(RLIMIT_STACK, &rl);
    printf("max stack size: %u\n", rl.rlim_cur);
}

我的主机上的结果

max stack size: 10485760

局部变量存储在堆栈中,显然,它们不能大于他的最大大小

【讨论】:

  • +1,很棒的信息。在我的 Ubuntu VM 上,这是 8MB,也可以通过 ulimit -s 找到
【解决方案2】:

char 数组的大小没有限制,但与可用堆内存相比,堆栈大小相对受限。你可能在这里溢出了堆栈。您可以尝试将memblock 设为静态

static char memblock[MEMSIZE];

或动态分配

char* memblock = malloc(MEMSIZE);
if (memblock == NULL) {
    printf("Error: failed to allocate %d byte buffer\n", MEMSIZE);
    return -1;
}
memblock[10] = '\0';
printf("%s", memblock);
free(memblock);

【讨论】:

  • 在写入之前最好检查返回给memblock的值。
  • @MarounMaroun 是的。为了简洁起见,我跳过了这个,但这可能是错误的调用。我现在已经添加了支票。
  • 谢谢,这很有意义。对于其他阅读本文的人,将 memblock 声明为静态需要我 #define MEMSIZE 1024*1024*10。动态分配工作正常,但我收到警告,直到我做了#include &lt;stdlib.h&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多