LoginSignup
YAMA2020
@YAMA2020 (M Y)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

C言語においてのポインタ参照演算子を使用した関数

解決したいこと

C言語において、下記のコードを、ポインタ参照演算子を使ったケースで作っているのですが、うまく起動しません(初投稿です💦)。

解決方法を教えて頂けると幸いです。

発生している問題・エラー

文字列の長さの文が出力されません。

該当するソースコード

C言語
↓
#include <stdio.h>
int ans(char *str){
    int i=0;
    while(*(str+i)!='\0'){
        i++;}
    return i;}

int main(void) {
    char *str;
    int j;
    printf("文字列を入力してください。\n");
    fflush(stdout);
    scanf("%s", str);
    j=ans(str);
    printf("文字列の長さは%dです。\n",j);
    return 0;
}

自分で試したこと

下記のコードはうまくいったのですが、上記のポインタを使用した方法がうまくいきません。

#include <stdio.h>
int ans(char str[]){
    int i=0;
    while(str[i]!='\0'){
        i++;}
    return i;}

int main(void) {
        char str[100];
        int j;
    printf("文字列を入力してください。\n");
    fflush(stdout);
    scanf("%s", str);
    j=ans(str);
    printf("文字列の長さは%dです。\n",j);
    return 0;
}
0

2Answer

char* str;

上記 str 変数は初期化されていないので不定値となります。
で、scanf が不定のアドレスを参照してしまうためエラーになります。

加えて、ポインタ変数は参照先(アドレス)のみを保持するので、
読み込んだ文字列を格納するバッファ(メモリ)を確保する必要があります。
(※うまく動いているコードは str をサイズ100の
  char 型の配列として確保しているので正常に動いているわけです)

ですので、動作させるにはメモリを確保して str 変数に代入する必要があります。

↓確保した配列を割り当てる例

int main( void ){
  char buf[100];        // バッファの確保    
  char* str = buf;      // バッファの割り当て

  /*省略*/

↓メモリを確保する例

int main( void ){
  char* str = (char*) malloc( 100 * sizeof(char) );  // メモリの確保

  /* 省略 */

  free( str );  // 確保したメモリの解放
  return 0;
}

メモリの確保とポインタ参照はC言語の肝なので頑張って理解してください。

1

Comments

  1. @YAMA2020

    Questioner
    ご丁寧にありがとうございます!!!!確保したメモリを割り当てるというのは今、勉強してる教科書にも載っていませんでした!あと、メモリの解放の概念も、様々な文献から、解放しないとどんどんPCが重くなってしまうというリスクのことも知れました!ありがとうございます!!

蛇足

必要なことはhakumai-iidaさんが書かれているので、以下は蛇足です。

  • 質問関連
    • mallocを使う際には、冒頭で#include <stdlib.h>の宣言が必要になります。
  • QiitaのTips
    • ソースを貼り付ける際に、「```c:」と書くことで、C言語の構文に基づいた着色が行われて読みやすくなります。
      • さらに、「```c:FileName.c」と書くことで、ファイル名を表記できます。
      • 詳しくは、Qiitaの公式ヘルプの「コードの挿入」をご参照ください。
    • 既に投稿した質問でも、再度編集して書き替えることができます。
      • 記事の右上辺りに「編集する」リンクがあると思います。
1

Comments

  1. @YAMA2020

    Questioner
    ご教授ありがとうございます!!mallocを記載したところ、動くには動いたのですが、エクリプスのコードに警告の波線が出てしまっていたのですが、上記の#include <stdlib.h>を記載したところ、すべての警告が外れて気持ちよく動いてくれました!ありがとうございます!!
    次回から「```c:」こちらのコードを記載させていただきます、たしかに凄く見やすくなりますね、助かります!!

Your answer might help someone💌