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 ポインターを宣言していて、初期化していないことです。したがって、それが指すメモリの場所はどこにでもある可能性があります。つまり、おそらく書き込みを試みてはならないということです。これが、segfault が発生する理由です。を使用すると、安全に書き込むことができるメモリ領域を割り当てることができ、これにより問題が解決されます (呼び出しが成功した場合)。セグメンテーション違反やアクセス違反を起こさずに、ランダムなメモリ位置にデータを書き込むことはできません。mallocmalloc

于 2012-09-14T21:31:55.737 に答える
3

pch3は char ポインターですが、問題の原因であるストレージが関連付けられていません。ポインターが指すことができる 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");

ただし、null ポインターが返されていないかどうかを確認することをお勧めします。

于 2012-09-14T21:32:14.277 に答える