char *ptr = (char*)malloc(10);
if(NULL == ptr)
{
printf("\n Malloc failed \n");
return -1;
}
else if(argc == 1)
{
printf("\n Usage \n");
}
else
{
memset(ptr, 0, 10);
strncpy(ptr, argv[1], 9);
while(*ptr != 'z')
{
ptr++;
}
if(*ptr == 'z')
{
printf("\n String contains 'z'\n");
/* Do some more processing */
}
free(ptr);
}
在前面的代码中,假设程序的参数是:Mixx
,程序会产生分段错误。
我的问题是:
当我在while循环中执行此操作时:
ptr++;
这是否意味着分配给指针ptr的内存大小也会发生变化,这就是为什么当我调用free()函数时它会崩溃的原因。
答案 0 :(得分:4)
你的预感是正确的:程序的行为未定义。
您必须将ptr
的原始值传递给free
。
(另外,while(*ptr != 'z')
很容易超出您的输入。请考虑检查\0
。)
答案 1 :(得分:1)
您只能传递malloc
calloc
,realloc
或char *ptr = (char*)malloc(10);
char *ptr_sav = ptr;
...
free(ptr_sav);
返回的指针while(*ptr != 'z' && *ptr != '\0')
。你传递的是一个不同的指针。它指向分配的块内的事实并不重要。
您需要跟踪原始指针,以便释放它。
var searchController: UISearchController!
@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
view.addSubview(searchController.searchBar)
getItems()
}
此外,当您遍历字符串时,您不会检查是否到达字符串的末尾。如果您搜索空终止符,则访问您不拥有的内存并调用未定义的行为。
按如下方式添加支票:
{{1}}