我知道指针是什么,但是当谈到字符串/数组时,我真的很困惑 . 如果某人有答案或网站解释它会很棒 . 例如:
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 回答
在你的getname函数内部,当你返回一个指向name数组的指针,因为它被分配在堆栈上,它会被破坏,留下一个无效的指针 . 取消引用这样的指针会导致许多问题 .
您应该使用malloc / calloc在堆上的getname中分配name数组,以便在返回指针时不会销毁数据 .
关于像strncpy这样的函数,它们倾向于返回指向结果字符串的指针;例如:strncpy返回指向目标的指针 .
指针本身代表一个地址,例如如果你有一个类型为_1446006的指针,你可以随时用
printf("address of my pointer %p\n", pstr);
检查基础地址在C编程语言中,字符串是
char
的数组 . 如果你对数组及其内存布局有很好的了解,那么理解c风格的字符串并不难 . 一般来说,C中的数组是连续的内存块,其数组名称表示数组中第一个元素的地址 . 所以字符串是一块内存,其名称是第一个字符的char
数组地址 . 此外,c样式字符串终止,字符为\0
,因此如果您想自己管理字符串的内存,请记住拖尾的一个额外字节\0
.至于你的第二个问题,函数
getname
中的name
是一个局部变量,它的生命周期在函数返回时结束 . 但是,您仍然希望在不合适的函数外访问name
. 您可以像在dasblinkenlight 's and others' post中那样解决这个动态分配的内存问题 .祝好运 .