C 这个代码有错误吗?

C 这个代码有错误吗?,c,C,问我这个代码是否包含错误。 编译器没有给我任何错误,但是这段代码包含一些我不知道的参数 代码如下: int* mycalloc(int n) { int *p = malloc(n*sizeof(int)), *q; //what does the ", *q"? for (q=p; q<=p+n; ++q) *q = 0; return p; } 可能的解决办法是: 程序是正确的 第1行有一个错误 第2行有一个错误 第3行有一个错误 第4行有个错误 上面的代码中没有

问我这个代码是否包含错误。 编译器没有给我任何错误,但是这段代码包含一些我不知道的参数

代码如下:

int* mycalloc(int n) {
   int *p = malloc(n*sizeof(int)), *q; //what does the ", *q"?
   for (q=p; q<=p+n; ++q) *q = 0; 
   return p;
}
可能的解决办法是:

程序是正确的 第1行有一个错误 第2行有一个错误 第3行有一个错误 第4行有个错误 上面的代码中没有编译时错误,但在运行时它会崩溃,因为mymalloc正在为n个整数分配空间并初始化 用0替换它们

本可以这样做:

int *mymalloc(size_t n)
{
    int *arr = malloc(n * sizeof *arr);
    if(arr == NULL)
        return NULL;

    memset(arr, 0, n * sizeof *arr);
    return arr;
}
或者更好

int *mymalloc(size_t n)
{
    return calloc(n, sizeof int);
}
函数执行此操作的方式是使用 指针q。让我解释一下

int *p = malloc(n*sizeof(int)), *q;
它声明了两个指向int变量p和q的int*指针。p是 使用malloc返回的值初始化,q保持未初始化状态。 这与执行以下操作相同:

int *p;
int *q;

p = malloc(n*sizeof(int));
但是在一行

下一部分是有趣的部分:

for (q=p; q<p+n; ++q)
    *q = 0; 
在第一个循环中,q设置为p,并执行*q=0。这和 执行p[0]=0

第一次迭代 b=分配内存的开始,也称为malloc返回值 si=整数的大小(以字节为单位),通常为4 越界 b+0B+1*SiB+2*SiB+3*SiB+4*SiB+5*si +-----+-----+-----+-----+-----+ | 0 | ???? | ???? | ???? | ???? | +-----+-----+-----+-----+-----+ ^ | p、 q 这就是*q=0后内存的外观。那么下一个循环是 已执行,但在此之前,q++已执行

在第二次迭代之前,`q++` b=分配内存的开始,也称为malloc返回值 si=整数的大小(以字节为单位),通常为4 越界 b+0B+1*SiB+2*SiB+3*SiB+4*SiB+5*si +-----+-----+-----+-----+-----+ | 0 | ???? | ???? | ???? | ???? | +-----+-----+-----+-----+-----+ ^ ^ | | p q 现在执行*q=0,与p[1]=0相同:

第二次迭代, b=分配内存的开始,也称为malloc返回值 si=整数的大小(以字节为单位),通常为4 越界 b+0B+1*SiB+2*SiB+3*SiB+4*SiB+5*si +-----+-----+-----+-----+-----+ | 0 | 0 | ???? | ???? | ???? | +-----+-----+-----+-----+-----+ ^ ^ | | p q 然后循环继续,你现在得到了点。这就是为什么在代码中
循环q的条件,*q是多变量声明的语法。错误在第3行,应该是qfor (q=p; q<p+n; ++q) *q = 0;
int p[] = { 1, 2, 3, 4, 5};
int *q = p;
int p[] = { 1, 2, 3, 4, 5};
int *q = &(p[0]);
import cv2
import numpy as np
import scipy.ndimage
from sklearn.externals import joblib
from tools import *
#from ml import *
import argparse
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import confusion_matrix
from sklearn.externals import joblib
from sklearn import svm
import numpy as np
import os
import cv2



parser = argparse.ArgumentParser()
parser.add_argument('--mode', '-mode', help="Mode : train or predict", type=str)
parser.add_argument('--a', '-algorithm', help="algorithm/model name", type=str)
parser.add_argument('--i', '-image', help="licence plate to read", type=str)
parser.add_argument('--model', '-model', help="Model file path", type=str)
#parser.add_argument('--d', '-dataset', help="dataset folder path", type=str)