C 中指针与整数的比较

问题描述 投票:0回答:8

我对 C 程序有一个有点愚蠢的问题。我的编译器告诉我: 警告:指针和整数之间的比较。我真的不知道为什么。 我只想在屏幕上写下每个字符。

我的代码:

int i = 0;
char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test
while (str[i] != NULL) {
    putchar(str[i]);
    i++;
}

你能帮我吗?我在互联网上没有找到任何有用的答案。

c pointers
8个回答
10
投票

NULL
是一个指针,
str[i]
i
数组的第
str
个字符。
char
是整数类型,当您比较它们时,您会收到警告。

我猜你想检查字符串结尾,你会检查值为 0 (字符串结尾)的字符,即

'\0'

但是:这对你没有帮助,因为你将它定义为字符数组而不是字符串,并且你没有在字符数组中定义终止0(你很幸运,它是隐含的) ).


9
投票

NULL 只能在指针上下文中使用,但在这里您将它与字符进行比较。

你通常想要这样的东西:

while (str[i] != '\0') {

[或者,当然,类似

puts(str);
printf("%s", str);
]


2
投票

您需要将 str[i] 的值与字符串的终止符“ ”进行比较,而不是与 NULL 进行比较,因为 NULL 被视为指针。你的

while (str[i] != NULL ) {

改为

while (str[i] != '\0') {

下:

int i = 0;
char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test
while (str[i] != '\0') {
    putchar(str[i]);
    i++;
}

2
投票

该代码的最大问题是,根据您的实现,它可能会编译而不会出现错误。

正如其他人所说,问题在于

NULL

 旨在表示空 
pointer 值,而不是空 character 值。使用 '\0'
 表示空字符。 (或者你可以使用
0
,这是等效的,但是
'\0'
更清楚地表达意图。)

NULL

 是一个扩展为实现定义的 
空指针常量 的宏。空指针常量可以是值为 0
 的整型常量表达式,也可以是转换为 
void*
 的表达式。这意味着 
NULL
 可以定义为 
0
((void*)0)
(以及其他变体)。

显然您的实现将其定义为类似

((void*)0)

 的内容,这就是您收到警告消息的原因。 (它可以,而且恕我直言,应该被视为致命错误)。

因此,除了作为空指针常量之外,切勿尝试使用

NULL

,并且不要指望编译器会在误用它时向您发出警告。


1
投票

str[i]

是一个角色。 
NULL
是一个指针。您无法有意义地比较这两种数据类型(尽管它们在内部可能会或可能不会实现为相同大小的整数)。这就是错误消息的全部含义。

并不是说比较不仅类型不正确,而且也没有达到您可能的意思。您似乎假设具有不完整初始值设定项的字符数组将自动以字符终止,但该规则适用于字符串文字,而不适用于您自己创建的字符数组。事实上,您正在调用未定义的行为。


0
投票

NULL

被定义为指针类型,通常是
(void*)0
。这意味着它不应该与字符(单独使用时提升为整数)进行比较。问题在于以下几点:
str[i] != NULL
。正确的方法是将其与相同类型的内容进行比较,在这种情况下,您正在寻找空字符,
'\0'


0
投票
这里str[i]是一个字符,NULL是一个指针,所以我们无法进行逻辑比较。 使用 ' ' 与 str[i] 进行比较,因为它被定义为空字符,因此比较 带有空字符 ' ' 的字符 str[i] 是正确的方法,不会通过 任何警告。


-2
投票
试试这个:

int i = 0; char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test while (str[i] != "\0") { putchar(str[i]); i++; }
    
© www.soinside.com 2019 - 2024. All rights reserved.