我创建了一个反转字符串的函数。
我知道这个函数的代码已经可以在网上找到了,但是我开始用C语言开发,我想做我的函数来理解我在做什么。
我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* reverseString(char* chaineFonc);
char* reverseString(char* chaineFonc)
{
// Initialization
int stringLength = strlen(chaineFonc);
char* response = (char*)malloc((stringLength + 1) * sizeof(char));
int numCarac = stringLength - 1;
// For each Character in the String
for (int i = 0; i < stringLength; i++)
{
// Memorization
response[i] = chaineFonc[numCarac];
// Decrement
numCarac--;
}
// End - For each Character in the String
// Finalization
response[stringLength] = '\0';
return response;
}
int main(int nbArg, char** listeArg)
{
printf("\n%s",reverseString("ABCDEFGHIJKLMN"));
}
这段代码可以工作,但是在Visual Studio下出现了一个警告,指出当我使用这段代码response[stringLength] = '\0';
时出现了缓冲区溢出
我不明白为什么。
警告:
- Avertisement C6011**删除空指针"响应"。(取消引用空指针"响应")
- Avertissement C6386**删除'response'上的记录。(写入'response'时缓冲区溢出)
2条答案
按热度按时间7xllpg7q1#
您应该告诉我们您正在运行静态代码分析,这可能会给您以下警告:
您会收到警告C6011,因为
response
可能是NULL
,因为malloc
可能返回NULL
指针,尽管这种情况不太可能发生,特别是当allocaterd大小非常小时。您可以通过添加一些代码来消除此警告:
警告C6386确实是微软静态代码分析器的一个错误,我没有看到这个代码有任何问题。特别是下面的错误信息是矛盾的:
r1wp621o2#
看起来您正在使用malloc函数为响应数组分配内存,但您没有检查malloc的返回值以确保它成功。malloc函数返回一个指向已分配内存的指针,如果它无法分配所请求的内存量,则返回NULL。
在使用malloc分配的内存之前,你应该检查它的返回值。下面是一个例子来说明你是如何做到这一点的:
这将防止在malloc无法分配所请求的内存时发生缓冲区溢出。
此外,你还应该考虑使用calloc函数来代替malloc,因为它会将分配的内存初始化为零,这在某些情况下会很有用。使用calloc的语法与malloc类似,但它需要两个参数:要为其分配内存的元素的数量以及每个元素的大小。
例如: