一段 Arduino 代码(在 Visual Studio 中调试),用于从文本字符串中提取参数。输入是字符串“45 5 6”,您需要对其进行解析并将其逐个元素放入数组中。输出应该是:
tokens1[0]="45";
tokens1[1]="5";
tokens1[2]="6";
代码非常简单。指向 char 数组的指针被传递给输入 * 在里面我做 malloc 并分散行。在内部,该函数功能齐全,但由于某种原因,在输出中,之前在函数中设置的所有指针都消失了,即 "; tokens1[1] == NULL
问题 - 分配内存的指针在函数出口处去哪里?
#include "stdafx.h"
#include <string.h>
#include <iostream>
#pragma warning(disable : 4996)
void parceArgumenst(char *str, char* (*tokens)[4]) {
// char str[] = "1546 44 55 ";
char s[] = " ";
char *token;
char* tkncpy;
// char * tokens[4];
/* get the first token */
for (int i = 0; i<4; i++) { *tokens[i] = NULL; }
int j = 0;
token = strtok(str, s);
/* walk through other tokens */
while (token != NULL) {
tkncpy = (char *)malloc(strlen(token) + 1);
strcpy(tkncpy, token);
*tokens[j] = tkncpy;
j++;
token = strtok(NULL, s);
}
}
int main()
{
char* tokens1[4];
char str[] = "45 5 6";
parceArgumenst(str, &tokens1);
std::cout << "Name: " << tokens1[1] << "\n";
return 0;
}
编译器将这一行
*tokens[j] = tkncpy;
理解为*(tokens[j]) = tkncpy;
,并导致 的数组溢出j != 0
。您需要添加括号:
(*tokens)[j] = tkncpy;
.