【问题标题】:Can someone interpret this for me? [duplicate]有人可以为我解释一下吗? [复制]
【发布时间】:2017-10-03 23:31:23
【问题描述】:
Program received signal SIGSEGV, Segmentation fault.
memcpy ()
    at ../sysdeps/x86_64/multiarch/../multiarch/memmove-vec-unaligned-erms.S:143
143 ../sysdeps/x86_64/multiarch/../multiarch/memmove-vec-unaligned-erms.S: No such file or directory.
(gdb) bt
#0  memcpy ()
    at ../sysdeps/x86_64/multiarch/../multiarch/memmove-vec-unaligned-erms.S:143
#1  0x00007ffff764aa2e in __GI__IO_default_xsputn (f=0x7fffffffcf30, 
    data=<optimized out>, n=30) at genops.c:438
#2  0x00007ffff761c59c in _IO_vfprintf_internal (
    s=s@entry=0x7fffffffcf30, format=<optimized out>, 
    format@entry=0x55555555773f "%s/%s", ap=ap@entry=0x7fffffffd058)
    at vfprintf.c:1637
#3  0x00007ffff763e61b in __IO_vsprintf (
    string=0x3930313938393339 <error: Cannot access memory at address 0x3930313938393339>, format=0x55555555773f "%s/%s", 
    args=args@entry=0x7fffffffd058) at iovsprintf.c:42
#4  0x00007ffff7623717 in __sprintf (s=<optimized out>, 
    format=<optimized out>) at sprintf.c:32
#5  0x000055555555680e in take_action (
    hash=0x7fffffffd4d0 "4ef3065e42d1ba6d821e734b2957b264", 
    index=0x7fffffffd36c, filnamE=0x7fffffffd5d0 "fs", 
    time_s=0x7fffffffd4a0 "1493989109") at file_sync.c:652
#6  0x0000555555556f25 in run_client (port_no=10009) at file_sync.c:821
#7  0x00005555555571df in main (argc=3, argv=0x7fffffffdef8)
    at file_sync.c:923

我得到这个的代码是:

    char *fnam;
    int nn = sprintf(fnam,"%s/%s",cwd,filnam);
    fnam[nn] = '\0';

其中cwd 是一个字符串,其值为:"/home/username/dir1/dir2/di3" filnam 具有价值:fs

我知道这些是值,因为我已经将它们打印出来了。

有人可以为我解释这个错误吗?我似乎无法弄清楚这一点。请在这件事上给予我帮助!谢谢!

编辑:

好的,这是要求的声明:

char cwd[256];
getcwd(cwd, sizeof(cwd));
**// getting cwd here**

DIR *directory = NULL;
pdir = opendir(cwd);

if(directory ==  NULL){printf("\nDirectory bad!!\n");exit(1);}  
char * filnam;
struct dirent *uppp = NULL;
while( uppp = readdir(directory) ) 
{
    if(uppp == NULL){printf("\nproblemo. \n"); exit(1);}
    filnam = uppp->d_name;
    if(filnam[0] == '.') { continue; }
**// this is where I'm getting filename**



}

【问题讨论】:

  • 我不知道为什么这会被否决
  • Program received signal SIGSEGV, Segmentation fault。看起来这是一个段错误。
  • 但是如果你没有正确分配fnam[],并且超出了内存缓冲区,行为是不确定的。它可能在某些时候有效,然后在其他时候无效。
  • 问题的关键在这里string=0x3930313938393339 &lt;error: Cannot access memory at address 0x3930313938393339&gt; 对我来说,这看起来更像是 ASCII 而不是地址:-o
  • if(uppp == NULL){printf("\nproblemo. \n"); exit(1);} 读起来非常不愉快,而且没有必要,因为由于循环控制,uppp 不会在循环内成为NULL。在我看来,您正在仔细检查只是为了确定,这是一件可怕的事情,它表明您不知道自己在做什么。

标签: c memory tcp network-programming printf


【解决方案1】:

问题出在这里:

char *fnam;
int nn = sprintf(fnam,"%s/%s",cwd,filnam);
fnam[nn] = '\0';

fnam 未初始化。

试试这个:

char fnam[500];
int nn = sprintf(fnam,"%s/%s",cwd,filnam);

// -> remove this, it's not necessary: 
//    fnam[nn] = '\0';

【讨论】:

  • 我虽然是这样,但 OP 说 fnam 的大小是 256...我们会看到...
  • @LPs OP 刚刚添加了 fnam 的声明。现在他已经这样做了,答案很明显(它是未初始化的)。
  • @LPs OP 刚刚将违规代码添加到问题中。
  • WT............ ;) OP 现在有我的 DV......
  • @SEsuks 在上一个答案中您写道:fnam 的大小为 256。直接从终端:cwd "/home/uuuu/ATLAS/CONFIG/ARCHS" fnam "fs"... WTx!!!!你在浪费我们的时间
猜你喜欢
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多