1

我知道指针是什么,但是当涉及到字符串/数组时,我真的很困惑。如果有人有答案或解释它的网站,那就太好了。例如:

char * strncopy (char*dest, char * source, size_t);

为什么是指针?它指向什么?它是指针通常存储地址吗?

在我的教科书中说,每个字符串构建函数都是指针 char* 类型。

此外,我试图看看我是否可以编写一个可以清除问题的程序,但它没有用。有人可以告诉我如何解决它,或者我做错了什么。

#include <stdio.h>
#include <string.h>    

char * getname ()
{
    char name [10];
    scanf ("%s", name);
    return (name);
}    

int main (void)
{
    char name[10];
    printf ("Enter your name\n");
    name[] = getname();
    printf ("Hi %s", name);
    return (0);
}
4

2 回答 2

1

在您的 getname 函数内部,当您返回指向名称数组的指针时,因为它是在堆栈上分配的,它会被销毁,从而为您留下无效的指针。取消引用这样的指针会导致很多很多问题。

您应该使用 malloc/calloc 在堆上的 getname 内分配名称数组,以便在返回指针时不会破坏数据。

对于 strncpy 之类的函数,它们倾向于返回指向结果字符串的指针;例如:strncpy 返回一个指向目的地的指针。

于 2012-04-09T00:57:19.097 回答
0

指针本身代表一个地址,例如,如果你有一个指针类型char *pstr,你可以随时检查底层地址printf("address of my pointer %p\n", pstr);

在 C 编程语言中,字符串是char. 如果你对数组及其内存布局有很好的了解,那么理解 c 风格的字符串对你来说并不难。一般来说,C 中的数组是一块连续的内存,数组的名称表示数组中第一个元素的地址。字符串也是如此,它是一块内存,名称为char第一个字符的数组地址。此外,c 风格的字符串以 character 结尾\0,因此如果您想自己管理字符串的内存,请记住为 tailing 多留一个字节\0

至于你的第二个问题,你的namein 函数getname是一个局部变量,它的生命周期在函数返回时结束。但是,您仍然想在name不合适的功能之外访问。您可以像在 dasblinkenlight 和其他人的帖子中那样动态分配内存来解决这个问题。

祝你好运。

于 2012-04-09T01:12:07.483 回答