[英]Pointer to char and character array in C
我一直想知道这两个在C语言之间有什么区别
char *str;
char str[50];
我有以下代码用于从用户输入中读取字符串,而不是使用gets。
int read_line(char *str, int n);
int main (int *argc, char *argv[])
{
char *str;
read_line(str, 50);
printf("%s", str);
return 0;
}
int read_line(char *str, int n)
{
int ch, i = 0;
while((ch = getchar()) != '\n')
{
if(i < n)
{
*str++ = ch;
i++;
}
}
*str = '\0';
return i;
}
编译工作正常,但在尝试运行时崩溃了。 然后将参数更改为read_line()
函数,而不是char *str
我使用char str[50]
。
使用char *str[50]
作为参数时,程序将按预期运行。
有人可以解释为什么会这样吗? 或pointer to char
和character array
的pointer to char
的主要区别是什么?
数组ID或多或少像指针一样工作。
但是使用指针,您始终需要手动执行3个步骤:
char str[50];
三个都做,而char *str;
只创建一个未初始化的指针,甚至不创建指向的缓冲区。
指针和数组ID之间的进一步区别:
sizeof array
返回数组大小,而sizeof ptr
返回存储地址所需的内存大小。 主要区别在于,后者为50个字符分配内存(str是第一个元素的指针),而前者仅声明一个指针(除了指针变量本身的内存之外,没有分配内存)。
如果您运行此简单程序,将立即看到区别
#include <stdio.h>
int main( void )
{
char *str1;
char str2[50];
printf( "%zu\n", sizeof( str1 ) );
printf( "%zu\n", sizeof( str2 ) );
}
程序输出可能看起来像
4
50
如您所见,数组str2
有足够的内存来存储最多50个字符的字符串,而指针只能存储某些内存的地址。
当您像代码中那样将数组传递给函数时
read_line(str2, 50);
(其中str2声明为char str2[50];
),然后将数组名称隐式转换为指向其第一个元素的指针。 因此,例如,这些函数声明是等效的
int read_line(char *str, int n);
int read_line(char str[50], int n);
甚至喜欢
int read_line(char str[100], int n);
int read_line(char str[], int n);
并声明相同的一个函数,因为像数组这样声明的参数已调整为指针。
因此,当您传递数组时,该函数将获得指向已定义内存的数组的第一个元素的指针,因为已定义了数组。
当您像在此主函数中一样传递指针时
int main (int *argc, char *argv[])
{
char *str;
read_line(str, 50);
printf("%s", str);
return 0;
}
则它没有被初始化并且具有一些不确定的值。 结果,程序行为是不确定的。 指针应指向一些分配的存储器,可以在其中存储输入数据。
例如,您可以通过以下方式执行此操作
int main (int *argc, char *argv[])
{
char *str1;
char str2[50];
str1 = str2;
read_line(str1, 50);
printf("%s", str1);
return 0;
}
要么
int main (int *argc, char *argv[])
{
char *str = malloc( 50 * sizeof( char ) );
read_line(str, 50);
printf("%s", str);
free( str );
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.