指针增加时,指针分配的内存大小会发生变化

时间:2016-08-08 13:47:46

标签: c pointers

 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()函数时它会崩溃的原因。

2 个答案:

答案 0 :(得分:4)

你的预感是正确的:程序的行为未定义

必须ptr原始值传递给free

(另外,while(*ptr != 'z')很容易超出您的输入。请考虑检查\0。)

答案 1 :(得分:1)

您只能传递malloc callocreallocchar *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}}