質問

私のコードsegfaultsというのではないでしょうか。

 1  #include <stdio.h>
 2
 3  void overwrite(char str[], char x) {
 4    int i;
 5    for (i = 0; str[i] != '\0'; i++)
 6      str[i] = x;
 7  }
 8
 9  int main(void) {
10    char *s = "abcde";
11    char x = 'X';
12    overwrite(s, x);
13    printf("%s\n", s);
14    return 0;
15  }

のデバッガgdbから、この問題は、6行がしたい店、char、c文字列を利用した場合、lvalueポインタdereferencingで同じ問題です。) これがその使命を果たすために

(gdb) run
Starting program: /tmp/x/x 

Breakpoint 1, overwrite (str=0x8048500 "abcde", x=88 'X') at x.c:5
5         for (i = 0; str[i] != '\0'; i++)
(gdb) s
6           str[i] = x;
(gdb) 

Program received signal SIGSEGV, Segmentation fault.
0x080483e3 in overwrite (str=0x8048500 "abcde", x=88 'X') at x.c:6
6           str[i] = x;
(gdb) q

私からの学習K&R-C書は、この簡素化し、例えば章2.8(は削除できます。わたしにはわかりませんが、問題です。

役に立ちましたか?

解決

でchar*s="abcde";作文字列を読み取り専用になります。試

char s[] = "abcde";

編集:説明:char*はポインタは、"abcde"が作成された読み取り専用メモリ->不変です。

char[]は、配列が完全に保管スタックトを初期化のメモリで可変

他のヒント

定義するときのポインタを 文字列リテラル, ることを宣言しますと const char *.

const char *s = "abcde";

そのように、コンパイラの警告を行なったとき、送信する文字列の上書きがなくなります。

const char *s = "abcde";
char t[] = "fghij";
char x = 'X';

overwrite(s, x); /* oops */
overwrite(t, x); /* ok */

なぶつけるだけでも精巧:検討の場合はどうなるのでしょうか、コンパイラさせます。き書き:

char *s1="abcde";
char *s2="abcde";
s1[0]='x';
puts(s1);
puts(s2);

の場合はコンパイラであることを認識し、二つのリテラルの再利用がその後もできるライン3、出力することはできない。

xbcde
xbcde

ありませんしいたします。このことは特に不思議な場合には、リテラルが広くられた部品を、プログラムを

試してみ:

#include <iostream>
#include <cstring>

using namespace std;

void overwrite(char[], char);

int main(void)
{
        char *s = strdup("abcde");
        char X = 'X';
        overwrite(s, X);
        cout << s << endl;

        if(s!=NULL)
                delete [] s;

        return 0;
}

void overwrite(char str[], char x)
{
        for(int i=0; str[i]!='\0'; i++)
                str[i] = x;
}

私からのパラメータ定義域を定義したタイプとしてのchar配列.中に通しのポインタをchar

きを変えてみては最初の行す:

 void overwrite(char *str, char x) {

Char配列のcharのポインタは意味的に同じです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top