【问题标题】:Incompatible types in assignment, Why can't I do this?分配中不兼容的类型,为什么我不能这样做?
【发布时间】:2012-10-20 01:59:51
【问题描述】:

我有一个结构 The_Word 有一个变量 char word[WORD_LENGTH]

我有以下

typedef struct The_Word
{
    char word[WORD_LENGTH];
    int frequency;
    struct The_Word* next;
} The_Word;

int someFunc(char* word)
{
/*Rest of method excluded*/

struct The_Word *newWord = malloc(sizeof(struct The_Word));

newWord->word = word; // error here. How can I assign the struct's word to the pointer word
}

【问题讨论】:

    标签: c arrays pointers struct char


    【解决方案1】:

    你需要使用strncpy来复制一个字符串:

    #include <string.h>
    
    int someFunc(char* word)
    {
      /*Rest of method excluded*/
    
      struct The_Word *newWord = malloc(sizeof(struct The_Word));
      strncpy(newWord->word, word, WORD_LENGTH);
      newWord->word[WORD_LENGTH - 1] = '\0';
    }
    

    您应该小心检查字符串是否适合数组。就是这样,当参数char* word的长度大于WORD_LENGTH时。

    【讨论】:

    • 如果 WORD_LENGTH > strlen(word) 会怎样?
    • @PrototypeStark 这就是newWord-&gt;word[WORD_LENGTH - 1] = '\0'; 的用途。
    • 不,我的意思是,“单词”有 10 个字符长(+1 '\0')并且 WORD_LENGTH = 100?执行 90 个副本不是浪费时间吗?
    • @PrototypeStark 函数 strncpy 最多复制 n 个字节。在您的示例中,该函数仅复制前 11 个字符。
    • @PrototypeStark 我的错,你是对的,strncpy 用空字节填充。但是,拨打strlen(word) 也需要时间。如果字符串的长度平均比WORD_LENGTH / 2 长,那么最好使用WORD_LENGTH 而不是strlen(word)
    【解决方案2】:

    您不直接分配指针。相反,您应该使用strncpy() 函数。

    strncpy(newWord->word,word,strlen(word));
    

    strcpy()memcpy() 的工作方式都类似。

    typedef struct The_Word
    {
        char word[WORD_LENGTH];
        int frequency;
        struct The_Word* next;
    } The_Word;
    
    int someFunc(char* word)
    {
    /*Rest of method excluded*/
    
      struct The_Word *newWord = malloc(sizeof(struct The_Word));
      memset(newWord->word,0,WORD_LENGTH);
      strcpy(newWord->word,word);
      /*return something*/
    }
    

    【讨论】:

    • 好的,为什么我不能使用 strcpy(newWord->word,word)?
    • 你可以。 @user1738539。我更喜欢 strncpy() 。 strcpy() 在那里也有效。
    • 你应该经常检查数组中是否有足够的空间来存储字符串。
    • strncpy() 函数不保证结果字符串以空值结尾。此外,如果您将 5 字节字复制到 20 KiB 缓冲区中,strncpy() 将小心地将剩余的 20475 字节内存清零(其中strcpy() 将在第六个字节之后停止)。有一种情况可以说“如果你不能安全地使用memmove()来复制字符串,你也不能安全地使用strcpy()strncpuy()”。
    【解决方案3】:

    这会导致类型不兼容错误,因为在 C 中,数组被视为常量指针。数组和指针并不完全相同。尽管它们在大多数其他情况下的行为相同,但您不能重新分配数组指向的内容。

    看起来您打算将字符串从函数参数复制到新分配的结构中。如果是这种情况,请按照其他人的建议使用 strncpy() 或 memcpy()。

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多