2017-01-23 9 views
-2

私はどのようにしてmallocが正確に動作するかはわかりません。Cで文字列を並べ替える

#include <stdio.h> 
#include <stdlib.h> 

int main() { 

char * string = (char*) malloc(sizeof(char)); 
string = "abc"; 

int * test = (int*) malloc(1 * sizeof(int)); 
*(test) = 5; 
*(test + 1) = 6; 


} 

私は文字列に任命値がちょうど1文字よりも大きい、まだうまくコンパイルすると思われるので、私は出力にエラーをこれを期待。 'string' は今

  1. を保存することになります。

    は、私はいくつか質問がありますか?私は割り振られた1つのスペースの後にヒープ上のメモリ空間にありますか?

  2. なぜcharがポインタを介して直接intにintを任せるのですか?

は、私は本当に私はここに「string」は今救われるでしょう

+1

なぜあなたは(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)[malloc関数の戻り値をキャスト]ですか? – PaulMcKenzie

+0

@PaulMcKenzie私はMITのOCWコースと、これを使用したPPT例が、あなたの権利を以下のよ、これは余分な情報 – DarkInc

+0

'*(テスト+ 1)= 6のためにかなり愚かな感謝を思わ;'あなたが書いている何範囲 –

答えて

1

あなたはおそらくこれが欲しい:これに代えて

char *string = (char*) malloc(sizeof(char) * 100); // allocate space for 100 chars 
strcpy(string, "abc"); // copy the "abc" into the memoory location pointer by string 

char *string = (char*) malloc(sizeof(char)); // << this allocates only a single char 
string = "abc"; 

そして

*(test) = 5; 
*(test + 1) = 6; 

がより良いと書かれています:

test[0] = 5; 
test[1] = 6; 

これは厳密には同等ですが、わかりやすいものです。あなたにここでの唯一の1文字にメモリを割り当てる場合

はあまりにも少ないメモリを割り当て

char *string = (char*) malloc(sizeof(char)); // allocate space 1 char strcpy(string, "abc"); // copy the "abc" into the memoory location pointer by string 

は、あなたのプログラムがまだ罰金コンパイルされますが、実行時に文字列の一部がコピーされます割り当てられていないメモリに移動すると、定義されていない動作(Googleの "未定義の動作")が発生します。

+0

:)私はごみ収集の言語でいくつかの小さなプロジェクトのみにプログラムしまし考慮私の少しあまりにも野心的だったかもしれないが、私は1つの文字のためのスペースを割り当てています私は "bc \ 0"を保持するアドレスが上書きされる別の変数のための領域を割り当てますか?編集:ええ、私のコメントが完了した前にお返事ありがとう – DarkInc

+0

@DarkInc編集の回答を参照 –

+0

魔法の数字は非常に悪い習慣です。悪い習慣で新しいプログラマーを始めるのは悪い考えです。 –

1

やっているかわからないんだけど?

char * string = (char*) malloc(sizeof(char)); 
string = "abc"; 

string今「ABC」(文字列リテラル)にポイント - (ヒープ内の)最初の動的割り当ては、トラックを失ってきた、あなたはメモリリークを持っています。

3

このコード

string = "abc"; 

char *あるstring変数へ​​文字列定数のアドレスを割り当てます。 malloc()コール(これはstringにあります)から返されたメモリのアドレスは上書きされ、失われます。他の回答に加えて

0

私はあなたに実例を示します。

A氏が住所「abc」に住んでいるとします。さて、Bさんの中には、 "xyz"という住所に住んでる人もいます。すぐに、Bさんの住所 "xyz"は "abc"に改名されました。今、あなたが住所 "abc"に行くと、Aさんではなく、Bさんに会うでしょう。しかし、これはAさんの場所が破壊されたことを意味するものではありません。これは単に、Aさんのリビングエリアに到達可能なアドレスがなく、失われていることを意味します。

同様に、あなたはmallocメモリエドメモリ「stringにED、その後string 『ABC』への再割り当ては、string以前mallocにアドレスを持っていた意味」。その後、あなたの "abc"はあるメモリに書き込まれ、そのメモリへのアドレスはstringに格納されます。したがって、メモリリークと呼ばれるメモリが永久に失われてしまいます。

0

stringが割り当てられていて、再割り当てされる前に使用されていないので、コンパイラは許可された何かを行うことを妨げません。関連する警告を出力する)。

2)については、mallocが返すポインタでやりたいと思っている用途には小さすぎる引数を使って、mallocという関数を呼び出しますが、正しい構文なので、コンパイラは文句を言わない。​​とmallocから前の値に

1に

回答)stringポイントは

2を失っている)あなたにもtest[0] = 5;を行うことができます。

2)の動作は未定義の動作です(範囲外の配列にアクセスする)。

0

最初は、要求された1文字のサイズのメモリが動的に割り当てられました。

char * string = (char*) malloc(sizeof(char)); 

そして、ポインタは、文字列リテラル "abc"の最初の文字のアドレスで再割り当てされました。

string = "abc"; 

結果、動的に割り当てられたメモリのアドレスが失われ、プログラムにメモリリークが発生しました。

プログラムはC++で書かれてしまう場合はC++の文字列リテラルは、一定の文字配列の種類を持っていると、ポインタstring

const char *string; 
のように宣言することshuldので、この文

string = "abc"; 

は、コンパイラ診断メッセージを発生する可能性が

文字列リテラルでは、静的な記憶期間を持ち、メインがコントロールを取得する前に割り当てられます。通常、すべての文字列リテラルは、いわゆる文字列リテラルプール内の場所です。代わりに、この文の

string = "abc"; 

あなたは、プログラムが未定義の動作をしている。この場合、

strcpy(string, "abc"); 

を書くことができます。しかし、通常は、関数mallocが、16バイトに等しい段落の値と等しい最小メモリエクステントを割り当てるという特徴のため、正常に動作し続けることができます。

+0

これはCの質問です。 C++コードの動作は無関係です –

+0

@ M.M「無関係」な情報はありません。 Cでは、ポインタは、C言語のqualifier constで宣言することもできます。これは、C++の場合と同じ方法で使用できます。 2)CとC++での同じ構造の比較は非常に便利で、CとC++の方が優れていることを理解するのに役立ちます。 –

関連する問題