为什么字符串有返回类型的指针?

时间:2012-04-09 00:50:22

标签: pointers

我知道指针是什么,但是当谈到字符串/数组时,我真的很困惑。如果某人有答案或网站解释它会很棒。例如:

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);
}

2 个答案:

答案 0 :(得分:1)

在你的getname函数内部,当你返回一个指向name数组的指针,因为它在堆栈上被分配,它会被破坏,留下一个无效的指针。取消引用这样的指针会导致许多问题。

你应该使用malloc / calloc在堆上的getname中分配name数组,这样当你返回指针时数据不会被销毁。

对于像strncpy这样的函数,它们倾向于返回指向结果字符串的指针;例如:strncpy返回指向目标的指针。

答案 1 :(得分:0)

指针本身代表一个地址,例如如果您的指针键入char *pstr,则始终可以使用printf("address of my pointer %p\n", pstr);

检查基础地址

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

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

祝你好运。