我知道指针是什么,但是当谈到字符串/数组时,我真的很困惑。如果某人有答案或网站解释它会很棒。例如:
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);
}
答案 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和其他人的帖子中那样解决这个动态分配的内存。