7

我试图弄清楚为什么我不能使用 strcpy() 命令将字符存储到我的 char 指针中。运行下面的代码时出现段错误。

#include <stdio.h> 
#include <string.h>                                                                  

int main(int argc, const char *argv[])                                               
{                                                                                    
   char *str1, *str2;                                                               
   int ret;                                                                         

   strcpy(str1, "abcdefg"); // stores string into character array str1              
   strcpy(str2, "abcdefg");                                                         

   printf("contents of %s \n", str1);                                               

   ret = strncmp(str1, str2, strlen(str2)); /* compares str1 to str2 */             

   if (ret > 0) {                                                                   
       printf("str1 is less than str2\n");                                          
  }                                                                                
  else if (ret < 0) {                                                              
      printf("str2 is less than str1\n");                                          
  }                                                                                
  else if (ret == 0) {                                                             
      printf("str1 is equal to str2\n");                                           
  }                                                                                

  return 0;                                                                        
  }   

谢谢!

4

3 回答 3

11

现在,str1并且str2只是一个字符的指针。当您这样做时strcpy(str1, "abcdefg"),它会尝试将字符串“abcdefg”中的字符写入str1指向并且str1指向未知内存的内存中,因为您可能没有任何写入权限,您会遇到分段错误。

解决它的一种方法是在堆上分配内存,然后存储这些字符串。

#include <stdlib.h>
...
/* assuming the max length of a string is not more than 253 characters */
char *str1 = malloc(sizeof(char) * 254);
char *str2 = malloc(sizeof(char) * 254);

您也可以使用strdupGangadhar提到的那样复制字符串。

另一种方法是按照Bryan Ash的建议在编译期间声明str1str2作为数组

char str1[] = "abcdefg";              
char str2[] = "abcdefg";

如果您想动态分配字符串但不在堆上,您可以使用alloca(有关更多详细信息,请阅读http://man7.org/linux/man-pages/man3/alloca.3.html),如kfsone所述

于 2013-10-13T05:25:25.600 回答
3

用命令编译它-Wall会给出一个有用的提示

test.c:12:10: warning: 'str1' is used uninitialized in this function [-Wuninitialized]
    printf("contents of %s \n", str1);
          ^
test.c:14:17: warning: 'str2' is used uninitialized in this function [-Wuninitialized]
    ret = strncmp(str1, str2, strlen(str2)); /* compares str1 to str2 */
于 2013-10-13T05:25:50.803 回答
2

鉴于此示例,您甚至不需要 strcpy,您可以使用:

char str1[] = "abcdefg";              
char str2[] = "abcdefg";

如果您想了解有关指针的更多信息,请参阅斯坦福 CS 教育图书馆的一本名为Pointers and Memory的优秀免费电子书。

于 2013-10-13T05:34:31.720 回答