使用strcmp函数无输出,直接比较指针却显示Same的问题求助
问题分析与解决:scanf使用错误导致的未定义行为
核心错误根源
你写的两段代码都存在致命问题:
- 定义的
char *i, *j;是未初始化的野指针,本身没有指向任何有效的可写内存空间。 scanf("%s %s", &i, &j);的参数类型完全不匹配:%s格式符要求传入一个指向可写字符数组的char*指针,用来存储输入的字符串,但你传入的是&i和&j(即char**类型的指针)。
这种错误会让scanf直接把输入的字符串内容写入指针变量i和j本身的内存空间(比如32位系统下指针变量占4字节),一旦输入字符串长度超过指针变量的大小,就会造成内存溢出,触发未定义行为——这就是两段代码出现异常的根本原因。
为什么直接比较指针会输出"Same"?
这是未定义行为的偶然表现:scanf错误修改了i和j的内存值,可能因为输入的两个字符串被错误写入后,i和j的数值(即指针地址)恰好变成相同值,导致i == j成立,输出"Same"。但这个结果完全不可靠,换输入或运行环境后结果可能完全不同。
为什么用strcmp会无输出?
调用strcmp(i, j)时,函数会尝试解引用i和j这两个指针,但此时它们指向的是非法内存区域(被破坏的栈内存或无效地址),程序会触发段错误(Segmentation Fault)直接崩溃,来不及执行printf就退出,因此没有任何输出。
修正后的代码示例
静态字符数组版本(推荐,简单安全)
#include <stdio.h> #include <string.h> int main(void) { // 定义足够大的字符数组存储输入,避免溢出 char i[100], j[100]; // 数组名会隐式转换为指向首元素的char*指针,符合scanf的参数要求 scanf("%s %s", i, j); if (strcmp(i, j) == 0){ printf("Same\n"); } else { printf("different\n"); } return 0; }
动态内存分配版本(适合不确定输入长度的场景)
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { char *i = NULL, *j = NULL; // 分配足够内存存储输入(假设输入不超过99字符+结束符) i = malloc(100 * sizeof(char)); j = malloc(100 * sizeof(char)); if (i == NULL || j == NULL) { printf("内存分配失败\n"); return 1; } scanf("%s %s", i, j); if (strcmp(i, j) == 0){ printf("Same\n"); } else { printf("different\n"); } // 释放动态分配的内存,避免内存泄漏 free(i); free(j); return 0; }
内容的提问来源于stack exchange,提问作者Harshil Zahran
相关产品推荐
相关产品推荐

