【问题标题】:segmentation fault in ar.drone control programar.drone 控制程序中的分段错误
【发布时间】:2014-01-24 08:21:59
【问题描述】:

我正在尝试使用 C 程序控制 ar.drone。将 at 命令写入文本文件并一一传递给程序。但是,如果我尝试使用缓冲区和 sprintf 语句来执行此操作,则会出现分段错误。

我的程序是:

char cmd[MAX_MSG],cmd2[MAX_MSG],cmd3[MAX_MSG];
snprintf(cmd,"AT*CONFIG= %u,\"general:navdata_demo\",\"TRUE\"",seq);
sendto(sd, cmd, MAX_MSG , flags, (struct sockaddr *) &droneAddr, sizeof(droneAddr));
seq++;
snprintf(cmd2,"AT*FTRIM=%u",seq);
sendto(sd, cmd2,MAX_MSG ,flags,(struct sockaddr *) &droneAddr,  sizeof(droneAddr));
seq++;
snprintf(cmd3,"AT*PMODE= %u,2",seq);
sendto(sd, cmd3, MAX_MSG , flags, (struct sockaddr *) &droneAddr,sizeof(droneAddr));
seq++;
char cmd1[MAX_MSG];
for(i=0;i<100;i++)
{ 
cmd1[strlen(cmd1)-1] = 0x0d;//change last character from new line to carriagereturn

 snprintf(cmd1,"AT*REF=%u,290718208",seq);
 printf("%s: %s\n",argv[0],cmd1);

rc = sendto(sd, cmd1, MAX_MSG , flags,  (struct sockaddr *) &droneAddr, sizeof(droneAddr));
if(rc<0) {
    printf("%s: can not send data\n",argv[0]);
    close(sd);
    exit(EXIT_FAILURE);
    }
seq++;
nanosleep(&wait_command , NULL);
}

什么是错误?有人可以帮忙吗?

【问题讨论】:

  • 在哪一行崩溃?
  • 顺便说一句,您应该正确格式化您的代码。许多错误在格式正确的程序中看起来很明显。

标签: c segmentation-fault printf ar.drone


【解决方案1】:

第一期

snprintf的原型是:

snprintf ( char * s, size_t n, const char * format, ... );

所以你所有的:

snprintf(cmd, "somestring", seq);

应该改为:

snprintf(cmd, MAX_MSG, "somestring", seq);

第二期

char cmd1[MAX_MSG];

for(i=0;i<100;i++)
{ 
  // here cmd1 contains garbage, hence the value of strlen(cmd1) is undefined
  cmd1[strlen(cmd1)-1] = 0x0d;
}

【讨论】:

    【解决方案2】:

    您没有提供完整的程序,但至少有一个明显的问题。

    buffer cmd1 没有初始化所以

     cmd1[strlen(cmd1)-1] = 0x0d;
    

    可能会导致段错误。

    我猜你想要的是

     cmd1[sizeof(cmd1)-1] = 0x0d;
    

    【讨论】:

      猜你喜欢
      • 2014-04-05
      • 2018-11-18
      • 2018-04-25
      • 2012-10-12
      • 2018-03-21
      • 2018-11-18
      • 2011-05-23
      • 1970-01-01
      相关资源
      最近更新 更多