ページ 11

char *とchar []

Posted: 2022年10月13日(木) 13:45
by daiwa

コード:

#include<stdio.h>

#define WORD_LEN_MAX 256 

typedef struct node{
    char word[WORD_LEN_MAX];
    int count;
    struct node *next;   
}node_t;

node_t *create_node(char *word){
    node_t *node;
    node = malloc(sizeof(node_t));
    if(node == NULL){
        printf("malloc eror\n");
    }
    node->word = *word;
    node->count = 1;

    return node;
}
node->word = *wordがVSCで「式は変更可能な左辺値である必要があります」とエラーが出ます。
やりたいことは構造体nodeのメンバwordに、関数node_t *create_nodeの引数*wordを代入したいです。
node->word = wordでも同じエラーが出ました

Re: char *とchar []

Posted: 2022年10月13日(木) 19:51
by みけCAT
C言語での文字列のコピーは、strcpy()系の関数を用いるといいでしょう。
strncpy() 関数を用いると、バッファオーバーフローを防ぐことができます。

コード:

strncpy(node->word, word, sizeof(node->word));
node->word[WORD_LEN_MAX - 1] = '\0'; /* 必ずナル文字を入れ、文字列として使う時のバッファオーバーフローを防ぐ */
引数wordとして文字列を指しているポインタ以外 (NULL、ナル終端されていないデータへのポインタなど)
が渡される可能性がある場合、strcpy() 系の関数を使うのは不適切です。
(バッファオーバーフローや、値0x00が終端として解釈されてその先がコピーされないなどの問題が発生しうる)
この場合、コピーしたいデータの仕様に合わせた適切な処理が必要です。