3

我正在尝试使用 strcpy 函数将字符串复制到另一个 char 指针变量中。但我总是遇到分段错误。这是我的代码。

/* strcat example */
#include <stdio.h>
#include <string.h>

int main()
{
  char str[100]="";
  char *pch3;
  strcpy(pch3,"Ravi");
  //strcat(str,pch3); //Segmnetation fault.
  puts(pch3);
  return 0;
}

如果我在这个中做同样的事情,我仍然会遇到分段错误。

 else
      {
         misc_rec_cnt++;
         fp1=fopen("breast-cancer-wisconsin-miscellaneous.data","a");
         fprintf(fp1,"%s",line2);
         fclose(fp1);
         fp2=fopen("missingSCNs.data","a");
         pch2=strtok(line2,",");
         fprintf(fp2,"%s\n",pch2);
         fclose(fp2);

         //pch3=(char *)malloc(sizeof(char)*strlen(line3));
         pch3 = strtok(line3,",");
         while(pch3!=NULL)
         {
             if(strcmp(pch3,"?") == 0)
             {
                strcat(str1,"0");
                strcat(str1,",");
             }
             else
             {
                //strcat(str1,pch3);
                strcat(str1,",");
             }
             pch3 = strtok(NULL,",");
         }
         strlen1=strlen(str1);
         memcpy(str2,str1,strlen1-1);
         fp3=fopen("breast-cancer-wisconsin-miscellaneous-cleansed.data","a");
         fprintf(fp3,"%s\n",str2);
         fclose(fp3);
      }
4

4 回答 4

4

您需要先分配空间,pch3然后再复制到它。用于在复制之前malloc创建一个足够大的 char 数组以容纳源字符串的元素。您当前正在做的是声明一个 char 指针而不是对其进行初始化。因此,它指向的内存位置可能在任何地方——这意味着你可能不应该尝试写入它——这就是你得到段错误的原因。Using将允许您分配一个可以安全写入的内存区域,这将解决您的问题(假设调用成功)。您不能只是将数据写入随机内存位置而不会出现段错误和访问冲突。mallocmalloc

于 2012-09-14T21:31:55.737 回答
3

pch3是一个字符指针,但它没有任何与之关联的存储,这是导致问题的原因。调用malloc()分配一些pch3指针可以指向的内存,你应该没问题。

此时,您有一个未初始化的 char 指针,只是指向未知的地方。所以试试这个:

  pch3 = (char *)malloc(sizeof(char) * 100); /* 100 just as an example */

教程可能会有所帮助或这个 SO 问题:Allocating char array using malloc

于 2012-09-14T21:31:53.843 回答
1

pch3是一个未分配的指针,因此您正在将数据写入一个不存在的位置。你的意思是把它分配给str?

char str[100]="";
char *pch3;
pch3 = str;
strcpy(pch3,"Ravi");
于 2012-09-14T21:35:32.187 回答
0

我建议您在将数据复制到随机位置之前先分配内存。

strcpy(pch3=(char*)malloc(sizeof("Ravi")),"Ravi");

但最好检查它是否没有返回空指针。

于 2012-09-14T21:32:14.277 回答