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

int main(){
    char *s;
    printf("enter the string : ");
    scanf("%s", s);
    printf("you entered %s\n", s);
    return 0;
}

最大 17 文字の長さの小さな入力 (たとえば、「aaaaaaaaaaaaaaaaa」) を提供すると、プログラムは問題なく動作しますが、それよりも長い入力を提供すると、「main.c が予期せず動作を停止しました」という実行時エラーが発生します。

コンパイラ (コードブロック) または PC (Windows 7) に問題がありますか? それとも、Cの入力バッファに何らかの関係がありますか?

4

9 に答える 9

21

ポインターが初期化されていないため、未定義の動作です。コンパイラに問題はありませんが、コードに問題があります:)

sそこにデータを保存する前に、有効なメモリを指摘してください。


バッファ オーバーフローを管理するために、書式指定子で長さを指定できます。

scanf("%255s", s); // If s holds a memory of 256 bytes
// '255' should be modified as per the memory allocated.

GNU C は非標準の拡張機能をサポートしています。指定されている場合%asは割り当てが行われるため、メモリを割り当てる必要はありませんが、ポインターへのポインターを渡す必要があります。

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

int main() {
  char *s,*p;

  s = malloc(256);
  scanf("%255s", s); // Don't read more than 255 chars
  printf("%s", s);

  // No need to malloc `p` here
  scanf("%as", &p); // GNU C library supports this type of allocate and store.
  printf("%s", p);
  free(s);
  free(p); 
  return 0;
}
于 2013-02-05T12:23:55.610 に答える
8

char ポインターは初期化されていないため、メモリを動的に割り当てる必要があります。

char *s = malloc(sizeof(char) * N);

ここで、N は読み取ることができる文字列の最大サイズですscanf 。入力文字列の最大長を指定せずに使用するのは安全ではありません。次のように使用します。

scanf("%Ns",s);

ここで、N は malloc の場合と同じです。

于 2013-02-05T12:23:16.510 に答える
1

文字列にメモリを割り当てていないため、許可されていないメモリ アドレスに書き込もうとしています。ここ

char *s;

ポインタを宣言しているだけです。文字列に予約するメモリの量を指定していません。これを次のように静的に宣言できます。

char s[100];

100文字を予約します。100を超えると、同じ理由で再度言及したようにクラッシュします。

于 2013-02-05T12:25:09.663 に答える
1

ポインタが指すバッファに十分なメモリを割り当てる必要があります。

    s = malloc(sizeof(char) * BUF_LEN);

必要がなくなった場合は、このメモリを解放します。

    free(s);
于 2013-02-05T12:24:37.463 に答える
1

文字配列にメモリを割り当てていないので、まず malloc() または calloc() を呼び出してメモリを取得してみてください。それからそれを使用してみてください。

s = malloc(sizeof(char) * YOUR_ARRAY_SIZE);
...do your work...
free(s);
于 2013-02-05T12:23:34.203 に答える
0

問題はコードにあります..にメモリを割り当てることはありませんchar *malloc()文字列を保持するのに十分な大きさのメモリが (with で) 割り当てられていないため、これは未定義の動作になります。

メモリを割り当ててから使用する必要がありsますscanf()(私が好むfgets()

于 2013-02-05T12:24:41.177 に答える
0
#include"stdio.h"
#include"malloc.h"

int main(){

        char *str;

        str=(char*)malloc(sizeof(char)*30);

        printf("\nENTER THE STRING : ");
        fgets(str,30,stdin);

        printf("\nSTRING IS : %s",str);

        return 0;
}
于 2019-07-15T13:28:38.037 に答える