如何判断字符指针数组char *tk[2]的元素是否存有值?
问题分析与解决方案
先修正原代码的致命问题
你的key函数存在两个严重问题,会导致后续判断和操作出错:
- 局部数组销毁导致野指针:
buffer_key是函数内的局部栈数组,当key函数执行完毕返回后,这块内存会被系统回收,此时tk里存储的指针都会变成野指针(指向已释放的内存),后续访问这些指针会引发未定义行为。 - tk数组未初始化:主函数中
char *tk[2];是局部数组,元素默认是随机垃圾值,不是NULL,所以没法直接通过tk[1] == NULL判断是否未存储值。
修正后的key函数
要解决野指针问题,需为每个token分配独立的堆内存(堆内存更安全,避免多线程冲突),同时在函数开始时将tk元素置为NULL,避免残留垃圾值:
#include <stdlib.h> #include <string.h> void key(char *keywords[], char *tk[], int k) { // 初始化tk元素为NULL,确保未赋值的位置是NULL tk[0] = NULL; tk[1] = NULL; int p = 0; char *delim = " \n"; size_t length = strlen(keywords[k]); // 注意:strlen返回不含终止符的长度,缓冲区要+1才能存完整字符串 char buffer_key[length + 1]; strcpy(buffer_key, keywords[k]); char *token_key = strtok(buffer_key, delim); // 限制最多存2个token,避免数组越界 while (token_key != NULL && p < 2) { // 为token分配内存并复制内容 tk[p] = malloc(strlen(token_key) + 1); if (tk[p] != NULL) { strcpy(tk[p], token_key); } p++; token_key = strtok(NULL, delim); } }
主函数中的判断逻辑
主函数里显式初始化tk为NULL(或依赖key函数的初始化),调用key后即可通过指针是否为NULL判断状态:
#include <stdio.h> int main() { // 示例keywords数组,假设k=0 char *keywords[] = {"key1", "key1 key2"}; int k = 0; // 显式初始化为NULL,更安全 char *tk[2] = {NULL, NULL}; key(keywords, tk, k); // 判断仅tk[0]有值的情况 if (tk[0] != NULL && tk[1] == NULL) { printf("仅tk[0]有值:%s\n", tk[0]); // 执行对应操作 } // 判断两个都有值的情况 else if (tk[0] != NULL && tk[1] != NULL) { printf("tk[0]和tk[1]都有值:%s, %s\n", tk[0], tk[1]); // 执行对应操作 } // 处理都为空的情况(可选) else { printf("tk中没有有效值\n"); } // 释放堆内存,避免内存泄漏 if (tk[0] != NULL) free(tk[0]); if (tk[1] != NULL) free(tk[1]); return 0; }
核心判断条件
要判断“仅tk[0]存储了值,tk[1]为空”,直接使用以下条件即可:
if (tk[0] != NULL && tk[1] == NULL)
该条件的前提是:
- tk的元素在使用前被正确初始化为
NULL - tk中存储的指针要么指向有效的堆内存,要么是
NULL
内容的提问来源于stack exchange,提问作者izuisquestioning
相关产品推荐
相关产品推荐

