【问题标题】:Passing char * to function returns different results than passing char []?将 char * 传递给函数返回与传递 char [] 不同的结果?
【发布时间】:2017-06-02 03:56:52
【问题描述】:

我正在用 C 语言编写一个函数来从字符串 (*s) 中获取下一个单词并将其复制到缓冲区 (*w) 中。它返回单词的第一个字符。

当输入字符串是 char 指针 (char *text) 时它工作正常,但是当我将类型更改为 char 数组 (char [MAXTEXT]) 时程序崩溃。

这让我很困惑,因为我认为编译器无论如何都会将 char 数组“衰减”为 char 指针。在我看来,输入是 char 指针还是 char 数组应该没有区别?

(声明在第10行char *text = "This should return the first word";,更改为char text[MAXTEXT] = "This should return the first word";时崩溃)

#include <stdio.h>
#include <ctype.h>

#define MAXTEXT 1000

int getword(char *inp, char *out, int lim);

void main()
{
    char *text = "This should return the first word";
    char *word;
    int i, c;

    printf("%c", getword(text, word, MAXTEXT));
    printf("%s", word);
}

int getword(char *s, char *w, int lim)
{
    static int bufp = 0;
    char c;
    char *word = w;

    while (isspace(c = s[bufp++]));

    if (c != EOF)
        *w++ = c;
    else if (!isalpha(c))
    {
        *w = '\0';
        return c;
    };

    for (; --lim > 0; bufp++)
        if (isalpha(c = s[bufp]) || c == '\'')
            *w++ = s[bufp];
        else
            break;
    *w = '\0';
    return word[0];
}

【问题讨论】:

  • 当你将word声明为指针时,它指向哪里?
  • 还没有?当我设置声明时,我不是简单地为指向 char 的指针的初始化留出内存吗?初始化发生在 getword() 函数内部。
  • 另外,除非您明确地将EOF 放入text 缓冲区,否则它将永远不会包含具有该值的字符。如果你这样做了,那么你就会遇到EOFint 而不是字符的问题,并且(char)EOF != EOF 有可能(这取决于char 是否为@ 987654331@ 与否,这是特定于编译器的)。标准 I/O 字符函数返回 int 而不是 char 是有原因的。
  • 关于word,你永远不会让它指向anywhere,这意味着它的值将是indeterminate,当你取消引用它时,你会得到未定义的行为。谁知道你会在哪里写角色?要么把它变成一个数组,要么为它动态分配内存。
  • 未定义的行为是未定义的。它可能看起来“有效”,直到它不起作用。

标签: c arrays string pointers


【解决方案1】:

问题是对于指针word,您没有分配任何内存。只需分配内存即可解决问题。 你的数组实现:

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define MAXTEXT 1000

char getword(char *inp, char *out, int lim);

int main()
{
    char text[100],word[100];
    // char *text = (char*)calloc(100,sizeof(char));
    strcpy(text,"This should return the first word");
    // char *word = (char*)calloc(100,sizeof(char));
    int i, c;

    printf("%c", getword(text, word, MAXTEXT));
    // printf("%s", text);
    return 0;
}

char getword(char *s, char *w, int lim)
{
    static int bufp = 0;
    char c;
    char *word = w;

    while (isspace(c = s[bufp++]));

    if (c != EOF)
        *w++ = c;
    else if (!isalpha(c))
    {
        *w = '\0';
        return c;
    };

    for (; --lim > 0; bufp++)
        if (isalpha(c = s[bufp]) || c == '\'')
            *w++ = s[bufp];
        else
            break;
    *w = '\0';
    return word[0];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-19
    • 2023-03-29
    • 2019-12-11
    • 2012-07-26
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多