簡體   English   中英

C中的字符串副本導致分段錯誤

[英]String copy in C causing segmentation fault

我試圖使用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);
      }

在復制到pch3之前,需要為pch3分配空間。 使用malloc創建一個足夠大的char數組,以便復制之前容納源字符串的元素。 你目前正在做的是聲明一個char指針而不是初始化它。 因此,它指向的內存位置可以是任何位置 - 這意味着您可能不應該嘗試寫入它 - 這就是您獲得segfault的原因。 使用malloc將允許您分配一個可以安全寫入的內存區域,這將解決您的問題(假設對malloc的調用成功)。 您不能只是將數據寫入隨機內存位置而不會遇到段錯誤和訪問沖突。

pch3是一個char指針,但它沒有與之關聯的任何存儲,這是導致問題的原因。 調用malloc()來分配一些pch3指針可以指向的內存,你應該沒問題。

此時你有一個未初始化的char指針,只是指向一個未知的地方。 試試這個:

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

教程可能會有所幫助,或者這個問題: 使用malloc分配char數組

pch3是一個未分配的指針,因此您將數據寫入不存在的位置。 你的意思是把它分配給str嗎?

char str[100]="";
char *pch3;
pch3 = str;
strcpy(pch3,"Ravi");

我建議您在將數據復制到隨機位置之前先分配內存。

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

但最好檢查一下它是否沒有返回空指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM