概要
ふつうのLinuxプログラミング第2版の練習問題で理解できないところがあり、
ご教示いただきたいです。
第10章
問題1: コマンドライン引数で指定されたディレクトリ以下を再帰的にトラバースして、
見つかったファイルのパスをすべて表示するプログラムを書きなさい。
シンボリックリンクをたどってはいけません。
公式回答ソース:https://github.com/aamine/stdlinux2-source/blob/master/traverse.c
不明点、試したこと
上記コードの106行目で、構造体の(char*)型メンバ変数ptrに対して、下記の処理を実施しています。
*strrchr(pathbuf->ptr, '/') = '\0';
手元で動かしたところ、上記のソースは正常終了いたしますが、
通常だと(char*)型変数への再代入は Segmentation fault になると理解しています。
試しに、該当する箇所のみ抜き出した以下のプログラムを実行したところ、
再代入の箇所で Segmentation fault となりました。
この事象について、どのように解釈したらよろしいでしょうか。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define INITLEN 1024 struct strbuf { char *ptr; size_t len; }; int main(int argc, char *argv[]) { struct strbuf *pathbuf; pathbuf = (struct strbuf *)malloc(sizeof(struct strbuf)); pathbuf->ptr = malloc(INITLEN); pathbuf->len = INITLEN; pathbuf->ptr = "abc"; printf("%s\n", pathbuf->ptr); // "abc" printf("%s\n", strrchr(pathbuf->ptr, 'b')); // "bc" // pathbuf->ptr[0] = 'A'; // Segmentation fault // *strrchr(pathbuf->ptr, 'b') = '\0'; // Segmentation fault return 0; }
実行環境
OS: Ubuntu 22.04.1 LTS
gcc: Ver11

回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/09/02 11:36
2022/09/02 13:20
2022/09/02 13:21