分段故障延迟

时间:2013-10-31 21:32:32

标签: c

我有这个程序读取字符串并将其分为三部分。第一部分是操作码,第二部分是数据,第三部分是密钥。

使用示例:

put this is stackoverflow

opcode: put 
data: this is
key: stackoverflow

Code Main:

 int main(int argc, char **argv){
          char command[MAX_MSG];
          fgets(command, sizeof(command), stdin);
          char *data;char *key;
          command[strcspn (command, "\n")] = '\0';
          char *aux_command_key = strdup(command);
          char *aux_command_data = strdup(aux_command_key);
          char *opcode = strtok(command, " ");          
          int success = 0;

          if(strcmp(opcode, "put") == 0){
                key = strdup(getKey(aux_command_key, opcode));
                if(key == NULL){
                       printf("Invalid number of arguments.\n");
                       return -1;
                 }

                 else
                       data = getData(aux_command_data, opcode, key);
          }
          printf("opcode: %s\n",opcode);
          printf("data: %s\n",data);
          printf("key: %s\n",key);               
          free(aux_command_key);
          free(aux_command_data);
}

我的问题是当我在没有按键的情况下运行我的程序时,它会给我分段错误,而不是: “无效的参数数量”。 我不知道为什么会这样。感谢。

2 个答案:

答案 0 :(得分:0)

如果你在没有提供密钥的情况下运行该程序,那么getKey(aux_command_key, opcode)将返回NULL

如果参数不是有效的字符串指针,则

strdup()具有未定义的行为。 (换句话说,不要将空指针传递给strdup())。

POSIX标准一般说明了关于库函数的以下内容(C标准有类似的语言,但strdup()是POSIX的一部分,而不是C标准):

  

2.1.1功能的使用和实施

     

以下各项陈述均适用于所有功能,除非   在以下详细说明中明确说明:

     
      
  1. 如果函数的参数具有无效值(例如值)   在函数域之外,或者在地址之外的指针   程序空间或空指针),行为未定义。
  2.         

    ...

假设参数必须有效,除非文档明确声明处理某些无效值是一个很好的经验法则,几乎可以遵循任何API。请参阅:"Basic ground rules for programming - function parameters and how they are used"

答案 1 :(得分:0)

您正在使用getKey指令调用put,并且您说您在输入中没有提供足够数量的参数。因此,我认为getKey将返回NULL。您无法使用strdup致电NULL

我的建议:首先,致电getKey,然后,如果它没有返回NULL,您可以复制它:

  if(strcmp(opcode, "put") == 0){
        key = getKey(aux_command_key, opcode);
        if(key == NULL){
               printf("Invalid number of arguments.\n");
               return -1;
         }
        else {
               key = strdup(key);
               data = getData(aux_command_data, opcode, key);
         }
  }