将指针传递给函数并在外部访问它

时间:2016-08-01 18:59:31

标签: c string pointers

我正在尝试连接两个字符串文字指针,并将它们存储在第三个字符串中,该字符串动态分配内存以适应两个字符串,最后添加并打印出字符串char。我无法在函数外部打印字符串。

 //Here is the function
    void join(char ptr1, char ptr2, char **ptr3) {


        char tempStr[strlen(strPtr1) + strlen(strPtr2)+1];
        strcpy(tempStr, ptr1);
        strcat(tempStr, ptr2);
        *ptr3 = (char*)malloc(strlen(tempStr));
        strcpy(ptr3, tempStr);

        printf("%s\n", ptr3);
   }

主要是我有这些变量

char *str1 = "print "; char *str2= "out"; char *str3;

join(str1,str2,&(str3));

printf("%s",str3)://segmentation fault occur here

我已经问了类似的question指针操作,我仍然在努力解决这些问题。

5 个答案:

答案 0 :(得分:1)

如果这是C,则忽略了字符串末尾的'\ 0'。试试这个

height

另外,为什么不返回新字符串而不是传入对ptr3的引用?

答案 1 :(得分:1)

您发布的代码中的问题是该行

 for(var i = 1; i < GlobalObject[0].length; i++) {
    var opt = GlobalObject[0][i];
    var subString = opt.substring(opt.length - 4, opt.length);

    if (i != GlobalObject[0].length -1 ) {
    var opt2 = GlobalObject[0][i+1];
    var subString2 = opt2.substring(opt2.length - 4, opt2.length);
    }
    else {}


    if (subString != "0000") {
    var el = document.createElement("option");
    el.textContent = "\u00A0" + "\u00A0" + "\u00A0" + "\u00A0" + "\u00A0" + opt;
    el.value =  opt;
    newOptGroup.appendChild(el); 
    }

    else  {

    var newOptGroup = document.createElement("OPTGROUP");
    newOptGroup.label = opt;
    newOptGroup.value = opt;
    }

    if (subString2 == "0000" || i == GlobalObject[0].length-1 ) {
    console.log("here");
    ChannelList.add(newOptGroup);

   }
   }

应该是

    *ptr3 = (char*)malloc(strlen(tempStr));

原因与您需要在行中使用 *ptr3 = (char*)malloc(strlen(tempStr) + 1); 的原因相同:

+1

您可以通过不将char tempStr[strlen(ptr1) + strlen(ptr2)+1]; 创建为临时对象来简化功能。

tempStr

答案 2 :(得分:0)

您遇到的一个问题是,您将ptr1 ad ptr2声明为字符而不是指针。

你有什么理由不能使用sprintf()?

std::string(const char*)

答案 3 :(得分:0)

编译器警告未完全启用。有了良好的编译器和警告,编译器会发出警告。这可以节省您的时间并避免不必要的帖子。

void join(char *ptr1, char *ptr2, char **ptr3) {
  ...
  // warning: passing argument 1 of 'strcpy' from incompatible pointer type 
  strcpy(ptr3, tempStr);

  // Code should have been
  strcpy(*ptr3, tempStr);

一些编码思路:考虑以下方法,利用代码支付价格一次找到字符串长度,不需要再次这样做。

// As ptr1,ptr2 not changed, use const, it's less restrictive calling
// and potential for additional optimizations.
void join(const char *ptr1, const char *ptr2, char **ptr3) {
  size_t len1 = strlen(l1);
  size_t size2 = strlen(l2) + 1;

  *ptr3 = malloc(len1 + size2);
  // Check for allocation success
  if (*ptr3)) {
    memcpy(*ptr3, ptr1, len1);
    memcpy(*ptr3 + len1, ptr2, size2);
    printf("%s\n", *ptr3);
  }
}

答案 4 :(得分:0)

这里有两个直接的问题:

  1. 您没有在结果字符串的末尾为空终止符分配空格:

    *ptr3 = (char*)malloc(strlen(tempStr));
    

    应该是

    *ptr3 = (char*)malloc(strlen(tempStr) + 1);
    
  2. 你把错误的东西传给了strcpy。

    strcpy(ptr3, tempStr);
    

    应该是

    strcpy(*ptr3, tempStr);
    
  3. 我怀疑第二个是直接导致崩溃的原因,因为它可能会导致字符串指针(str3中的main)被字符串的开头覆盖,并且还会覆盖其他随机堆栈内存。