質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

1回答

630閲覧

C言語 セグメンテイションfault

REIA

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2019/12/14 11:38

最近、C言語でもC++でもポインタ変数への代入でエラーが頻出しています。
エラー内容としては

//gdb スタックトレース Program received signal SIGSEGV, Segmentation fault. 0x0040145e in StrCpy (pDst=0x405044 <__register_frame_info+4214852> "AICAKDEBCDLA", pSrc=0x405051 <__register_frame_info+4214865> "aaaa") at functions.c:3 3 *pDst='\0';

ソースコード

C

1//関数 2int StrCpy(char *pDst, char*pSrc){ 3 *pDst='\0'; 4 while(*pSrc!='\0'){ 5 *pDst = *pSrc; 6 pDst++; 7 pSrc++; 8 } 9 *pDst='\0'; 10 return 0; 11} 12//main 13#include "functions.h" 14#include <stdio.h> 15int main(void){ 16 char *buff="AICAKDEBCDLA"; 17 StrCpy(buff,"aaaa"); 18 printf("StrCpy : %s\n",buff); 19}

目的はなくただの勉強ソースコードなので別にstring.hのstrcpyを使ってくださいというのはなしでお願いします。
だいぶ前に実行した際には普通に動いたのですが、現在になって動かした際に動かなくなってしまったので、困っています。
メモリー自体変数宣言時に確保するものなので、その場所がたまたま悪かった場合に動かないということもあるのでしょうが、
それで動かないでは話にならないので、こういう場合の対策を教えていただきたいです。
ご回答のほどよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

char *buff="AICAKDEBCDLA";

StrCpy(buff,"aaaa");

buff は定数を指してますんで書き込みはできません
まあ、前のときに動かしたときとはコンパイラが変わってるんでしょう。

char buff[]="AICAKDEBCDLA";
とすればうごきますよ

投稿2019/12/14 11:46

編集2019/12/14 11:47
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

REIA

2019/12/14 11:52

回答ありがとうございます。 これでもconst char扱いになっちゃうんですね。 勉強不足でした。 ありがとうございました。
otn

2019/12/14 16:28

ふる~~~いFortranの1つでは、整数リテラルも書き換え可能だったそうです。 subroutine foo(n) n=100 return end ・・・・・・ call foo(50) a=50 で、aに100が入る。 (引数は常にby reference)
y_waiwai

2019/12/14 22:31

単純に考えれば、PCはRAMばかりなので、命令だろうが定数だろうが書き換え放題です。 8ビットCPUとか8086とかその時代は実際にそうでした。 その後、CPUにMMUが搭載され、メモリエリア(メモリセグメント)を指定して、書き換え不可、実行不可、などなどの指定を与え、その指定違反時には例外を生成させるなどの監視が行えるようになりました。 そんななんやかんやがあって、現在のこの実行環境というのがあります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問